@
代表Objective-C
的标志,表示正在使用Objective-C
语言.
Objective-C
语言关键词,@property
与@synthesize
配对使用. 其功能是:
- 让编译好器自动编写一个与数据成员同名的方法声明来省去读写方法的声明.
@property示例
写在头文件(.h)中:
@property int count;
等效于在头文件中声明2个方法:
- (int)count; - (void)setCount:(int)newCount;
@synthesize示例
实现文件(.m)中:
@synthesize count;
等效于在实现文件(.m)中实现2个方法.
- (int)count { return count; } - (void)setCount:(int)newCount { count = newCount; }
以上等效的函数部分由编译器自动帮开发者填充完成,简化了编码输入工作量.
@property语法
声明@property
的语法为:
@property (参数1,参数2) 类型 名字;
如:
@property(nonatomic,retain) UIWindow *window;
其中参数主要分为三类:
- 读写属性(readwrite/readonly)
- setter语意(assign/retain/copy)
- 原子性(atomicity/nonatomic)
各参数意义如下:
参数 | 意义 |
---|---|
readwrite | 产生setter/getter方法 |
readonly | 只产生简单的getter,没有setter. |
assign | 默认类型,setter方法直接赋值,而不进行retain操作 |
retain | setter方法对参数进行release旧值,再retain新值 |
copy | setter方法进行Copy操作,与retain一样 |
nonatomic | 禁止多线程,变量保护,提高性能 |
@property语法分析
getter 分析
@property(nonatomic,retain)test* thetest; @property(nonatomic,copy)test* thetest; //等效代码 -(void)thetest { return thetest; }
@property(retain)test* thetest; @property(copy)test* thetest; //等效代码 -(void)thetest { [thetest retain]; return [thetest autorelease]; }
setter分析
@property(nonatomic,retain)test* thetest; @property(retain)test* thetest; //等效代码 -(void)setThetest:(test *)newThetest { if (thetest!= newThetest) { [thetestrelease]; thetest= [newThetest retain]; } }
@property(nonatomic,copy)test* thetest; @property(copy)test* thetest; //等效代码 -(void)setThetest:(test *)newThetest { if (thetest!= newThetest) { [thetest release]; thetest= [newThetest copy]; } }
nonatomic
如果使用多线程,有时会出现两个线程互相等待对方导致锁死的情况(具体可以搜下线程方 面的注意事项去了解).在没有(nonatomic
)的情况下,即默认(atomic
),会防止这种线程 互斥出现,但是会消耗一定的资源.所以如果不是多线程的程序,打上 (nonatomic
)即可.
retain
如果只是@property NSString*str;
则通过@synthesize
自动生成的setter代码为:
-(void)setStr:(NSString*)value{ str=value; }
如果是@property(retain)NSString*str;
则自动的setter内容为:
-(void)setStr:(NSString*)v{ if(v!=str){ [str release]; str=[v retain]; } }
所有权关系
属性值 | 关键字 | 所有权 | 意义 |
---|---|---|---|
strong | __strong | 有 | 该属性所声明的变量将成为对象的持有者 |
weak | __weak | 无 | 该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil |
unsafe_unretained | __unsafe_unretained | 无 | 等效于__unsafe_unretaind 关键字声明的变量; iOS 5之前的系统用该属性代替 weak 来使用 |
copy | __strong | 有 | 与 strong 的区别是声明变量是拷贝对象的持有者 |
assign | __unsafe_unretained | 无 | 一般Scalar Varible用该属性声明,比如,int, BOOL |
retain | __strong | 有 | 该属性与 strong 一致; 只是可读性更强一些 |
注意:
delegate
和Outlet
应该用weak
属性来声明.同时,iOS 5 之前的版本是没有__weak
关键字的,所以weak
属性是不能使用的.这种情况我们使用unsafe_unretained
.