property 和 synthesize解说
这两个的标识的用法,要从setter和getter说起
一般,我们的程序都会有一个setter和getter来获取某个类的成员变量,object c 默认所有成员变量是私有的,所以利用setter和getter来解决这个问题,例如如下的C++语言
Class A{ private: int i; public: int getI(); void setI(int i); };
里面 getI()和setI()就是一对。
1.现在在.h文件中声明一个property
@property int count;
相当于在.h文件中声明了两个方法
-(int)count;
-(void) setCount:(int)count;
@synthesize count;等效实现了上面两个方法
其中参数主要分为三类:
读写属性: (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: 禁止多线程,变量保护,提高性能
该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者。
该属性对应 __weak 关键字,与 __weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被破弃之后,对象将被自动赋值nil。
并且,delegate 和 Outlet 应该用 weak 属性来声明。同时,如上一回介绍的 iOS 5 之前的版本是没有 __weak 关键字的,所以 weak 属性是不能使用的。这种情况我们使用 unsafe_unretained。
等效于__unsafe_unretaind关键字声明的变量;像上面说明的,iOS 5之前的系统用该属性代替 weak 来使用。
与 strong 的区别是声明变量是拷贝对象的持有者。
一般Scalar Varible用该属性声明,比如,int, BOOL。
该属性与 strong 一致;只是可读性更强一些。