【转】Objective-C语法property详解

1、简介:

property是Objective-C的关键词,与@synthesize配对使用,用来让编译好器自动生成与数据成员同名的方法声明。@synthesize则是用来生成对应声明方法的实现。

1.1 property的语法格式:

@property (参数1,参数2)类型名字;

这里的参数,主要有以下三种:

setter/getter方法(assign/retain/copy)

读写属性(readwrite/readonly)

atomicity(nonatomic)

1.2 三种方式的使用

assign/retain/copy  代表赋值的方式。

readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。

atomicity的默认值是atomic,读取函数为原子操作。

1.2.1 copy/reain/assign 在其中选择一个来确定属性的setter如何处理这个属性。NSObject对象采用这个中方式。

1.2.2 一些特别的Object比如NSSstring使用copy。

1.2.3 assign关键字代表setter直接赋值,而不是复制或者保留它。适用于基本数据类型,比如NSInteger和CGFloat,或者你并不直接拥有的类型,比如delegates。

2、如何使用property

1.1  没有property和有property的对比

在头文件定义 obj。在.m文件中使用

[cpp] view plaincopy

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. {
  4. NSObject *obj;
  5. }
  6. @end

[cpp] view plaincopy

  1. - (void)viewDidLoad
  2. {
  3. [super viewDidLoad];
  4. self.obj = nil;、
  5. }

提示不可用。

加上property

[cpp] view plaincopy

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. {
  4. NSObject *obj;
  5. }
  6. @property (nonatomic,retain) NSObject *obj;
  7. @end

编译能通过,运行,崩溃,提示错误 reason: ‘-[ViewController setObj:]: unrecognized selector sent to instance 0x6b6c480

那就是我们没事实现setter方法。

用@synthesize关键字实现getter 和setter。

在.m文件中

[cpp] view plaincopy

  1. @implementation ViewController
  2. @synthesize obj;
  3. - (void)viewDidLoad
  4. {
  5. [super viewDidLoad];
  6. self.obj = nil;
  7. }

运行,程序运行正常。说明setter 起作用了。

3、@property和@synthesize关键字 生成的代码

到底@property和@synthesize关键字生成了什么代码呢?我们自己实现getter 和setter也可以替代这些关键字。

把这两个关键字对应的代码注释掉

.h

[cpp] view plaincopy

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. {
  4. NSObject *obj;
  5. }
  6. //@property (nonatomic,retain) NSObject *obj;
  7. -(NSObject*)obj;
  8. -(void)setObj:(NSObject*)newObj;
  9. @end

.m

[cpp] view plaincopy

  1. @implementation ViewController
  2. //@synthesize obj;
  3. - (void)viewDidLoad
  4. {
  5. [super viewDidLoad];
  6. self.obj = nil;
  7. }
  8. -(NSObject*)obj{
  9. return obj;
  10. }
  11. -(void)setObj:(NSObject*)newObj{
  12. if(obj != newObj){
  13. [obj release];
  14. obj = [newObj retain];
  15. }
  16. }

再运行,也能正常启动。说明自己写的getter 和setter替代了property。

4、使用三种参数的对比

@property (nonatomic,retain)NSObject *obj;

@property (nonatomic,retain,readwrite) NSObject *obj;

readwrite是默认行为,所以这两行代码等价

@property (retain) NSObject *obj;

@property (atomic,retain) NSObject *obj;

atomic是默认行为,所以这两行代码是等价的。

@property(atomic,assign)int number;

@property(atomic) int number;

@property int number;

对int 来说,atomic assign都是默认行为,所以这三行是等价的。

@property  NSObject *obj;这样写行吗?不行的,报警告

只有int 等基础数据类型能这么写。对象必须加上赋值的类型。

@property  (retain) NSObject *obj;这样就没问题了。何时使用assign、何时使用retain、copy后面再讲。

5、retain和copy实验。

使用copy。

.h文件

[cpp] view plaincopy

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. {
  4. NSString *string;
  5. }
  6. @property  (nonatomic, copy) NSString *string;
  7. @end

.m文件

[cpp] view plaincopy

  1. @synthesize string;
  2. - (void)viewDidLoad
  3. {
  4. [super viewDidLoad];
  5. NSString *str = [[NSString alloc] initWithFormat:@"abcd"];
  6. NSLog(@"str_Point:%p  %@  retainCount:%d", str, str, [str retainCount]);
  7. self.string = str;
  8. NSLog(@"string_Point:%p  %@  retainCount:%d", string, string, [string retainCount]);
  9. }

打印结果

2012-07-19 20:41:44.853 TestProject1[1213:f803] str_Point:0x6a8e0b0  abcd  retainCount:1

2012-07-19 20:41:44.854 TestProject1[1213:f803] string_Point:0x6a8e0b0  abcd  retainCount:2

内存地址是一样的,不是想其他文字所写的那样,拷贝了一份内存,这里用copy也是浅拷贝。retain也+1

使用retain

[cpp] view plaincopy

  1. #import <UIKit/UIKit.h>
  2. @interface ViewController : UIViewController
  3. {
  4. NSString *string;
  5. }
  6. @property  (nonatomic, retain) NSString *string;
  7. @end

打印结果是:

2012-07-19 20:42:08.113 TestProject1[1230:f803] str_Point:0x6d3b8f0  abcd  retainCount:1

2012-07-19 20:42:08.114 TestProject1[1230:f803] string_Point:0x6d3b8f0  abcd  retainCount:2

结果和上面copy一样。

注意:在IOS5之后,加入了Automatic Reference Counting (ARC),iOS5中新加了关键字有strong, weak, unsafe_unretained。

著作权声明:本文由http://blog.csdn.net/totogo2010/原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢!

时间: 2024-11-09 06:47:08

【转】Objective-C语法property详解的相关文章

Atitit.jdk&#160;java8的语法特性详解&#160;attilax&#160;总结

Atitit.jdk java8的语法特性详解 attilax 总结 1.1. 类型推断这个特别有趣的.鲜为人知的特性1 2. Lambda1 2.1. 内部迭代意味着改由Java类库来进行迭代,而不是客户代码.例如:1 2.2. Stream 流失接口 管道(pipelines)模式2 2.3. 方法引用(Method reference)2 2.4.  默认方法(Default method)2 2.5. 生成器函数(Generator function)2 2.6. 新加入的Nashorn

Objective - c Foundation 框架详解2

Objective - c  Foundation 框架详解2 Collection Agency Cocoa provides a number of collection classes such as NSArray and NSDictionary whose instances exist just to hold onto other objects. cocoa 提供了一系列的集合类,例如,NSarray,NSdictionary.它们存在的目的就是为了保持其他对象. 1.1.1N

iOS 学习笔记——0004(@property详解)

这里以一个Person类进行举例: @interface Person : NSObject { ... } @property(nonatomic,copy)NSString* name; @end @property 做了三件事 1.大括号中(如上图的大括号),声明变量,变量前加_,这里是_name 2.生成对应的get方法 3.生成对应的set方法 可以在实现文件中,重写get,set方法 这里需要注意:如果get,set方法都是自己写的话,那么在大括号中的变量声明也需要自己写了 写到这里

Java 语法糖详解

语法糖 语法糖(Syntactic Sugar),也称糖衣语法,是由英国计算机学家 Peter.J.Landin 发明的一个术语,指在计算机语言中添加的某种语法. 这种语法对语言的功能并没有影响,但是更方便程序员使用.简而言之,语法糖让程序更加简洁,有更高的可读性. 有意思的是,在编程领域,除了语法糖,还有语法盐和语法糖精的说法,篇幅有限这里不做扩展了. 我们所熟知的编程语言中几乎都有语法糖.作者认为,语法糖的多少是评判一个语言够不够牛逼的标准之一. 很多人说 Java 是一个 "低糖语言&qu

正则表达式基本语法应用详解

1.正则表达式基本语法 两个特殊的符号'^'和'$'.他们的作用是分别指出一个字符串的开始和结束.例子如下: "^The":表示所有以"The"开始的字符串("There","The cat"等): "of despair$":表示所以以"of despair"结尾的字符串: "^abc$":表示开始和结尾都是"abc"的字符串--呵呵,只有&qu

Objective-C—— @Property详解

实例变量:属性其实说直白点就是 ivar + setter + getter(实例变量+存取方法),不过在OC中属性多了字面量这一系列特殊关键字使得OC属性有些不同. 成员属性我们应该都使用过,比如现在定义一个Car类有name和speed成员变量: #import <Foundation/Foundation.h> @interface Car : NSObject { @public NSString *name; NSInteger speed; } @end 在OC类的内部有一个偏移量

JSON 语法规则详解

JSON 的语法规则十分简单,无论用何种方法总结都只有数条而已,它参考了 C 语言家族的一些习惯,学习起来并不会感到陌生. 回顾JSON 的五点语法 1)- 数组(Array)用方括号("[]")表示. 2)- 对象(Object)用大括号("{}")表示. 3)- 名称/值对(name/value)之间用冒号(":")隔开. 4)- 名称(name)置于双引号中,值(value)有字符串.数值.布尔值.null.对象和数组. 5)- 并列的数据

py-day1简单使用方法及语法使用详解

一.python入门 1.python的标准格式 创建python文件以.py结尾 如:vi hello.py #!/usr/bin/env python #-*- coding:utf-8 -*-       #python3.5以上版本默认可以使用中文. print "Hello Word" 执行: python hello.py  即可 或者增加执行权限:chmod 755 hello.py ./hello.py 2.变量 name = "liudong" n

C#正则表达式语法规则详解

正则表达式通常包含字母文本(Literaltext)和元字符(metacharacter) 字母文本指的是普通文本如"abcde"可匹配字符串中任何包含"abcde"的字符串. 元字符则更加灵活运用通用的表达式匹配所有符合此表达式规律的字符串.C#正则表达式语法一. 匹配单个字符 []——从中选择一个字符匹配 中间支持的类型:单词字符([ae]).非单词字符([!?,;@#$*]).字母范围([A-Z]).数字范围([0]) eg.正则表达式[ae]ffect可匹配