- 读写属性:(readwrite/readonly)决定是否生成set访问器,设置可供访问级别
- setter语意:(assign/retain/copy)set访问器的语义决定以何种方式对数据成员赋予新值
- 原子性:(atomic,nonatomic)
readonly: 只生成getter方法.
此标记说明属性是只读的,如果你指定了readonly,在@implementation中只需要一个getter。或者如果你使用@synthesize关键字,也只会生成getter方法。如果你试图使用点操作符为属性赋值,你将得到一个编译错误。readonly关键字代表setter不会被生成, 所以它不可以和 copy/retain/assign组合使用。
assign: 简单赋值,不更改索引计数
copy: 建立一个索引计数为1的对象,然后释放旧对象
它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考”复制”部分。
atomic/nonatomic:
指出访问器不是原子操作,atomic表示属性是原子的,支持多线程并发访问,而默认地nonatomic,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定nonatomic,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了nonatomic,那么访问器只是简单地返回这个值。没有特别的多线程要求建议用 nonatomic 有助于提高性能。
在iOS5引入了自动引用计算(ARC)之后,对象变量属性新增了strong和weak,strong与retain作用类似,可以说是用来代替retain.
访问修饰符
@private: 用此指令修饰的实例变量可以被定义在该类的方法直接访问,但是不能被子类中定义的方法直接访问。
@public: 用此指令修饰的实例变量可以被该类中的方法直接访问,也可以被其它类定义的方法直接访问。
- getter=getterName,setter=setterName,设置setter与getter的方法名
- readwrite,readonly,设置可供访问级别
- assign,setter方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题
- retain,setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序
- copy,setter方法进行Copy操作,与retain处理流程一样,先旧值release,再Copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。
- nonatomic,非原子性访问,不加同步,多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。锁被加到所属对象实例级。
如果你不懂怎么使用他们,那么就这样 ->
- 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
- 使用copy: 对NSString
- 使用retain: 对其他NSObject和其子类