声明property的语法为:
@property (参数,参数,...) 类型 名字;
这里的参数主要分为三类:
读写属性(readwrite/readonly)
setter语意(assign/retain/copy)
原子性(atomic/nonatomic)
如果是基本数据类型,我们可以省略不写这些属性。
1.读写属性
@property (readwrite) int age;//代表这句会帮你生成getter方法和setter方法!这个是默认的属性!
@property (readonly) int age;//代表这句只会帮你生成getter方法。没有setter方法!
2.setter语意
assign
此标记说明设置器直接进行赋值,这也是默认值。在使用垃圾收集的应用程序中,如果你要一个属性使用assign,且这个类符合NSCopying协议,你就要明确指出这个标记,而不是简单地使用默认值,否则的话,你将得到一个编译警告。这再次向编译器说明你确实需要赋值,即使它是可拷贝的。
retain
oc对象一定要用retain!说白了就是对OC对象内存管理。
@property (retain)Book *book; //Book是一个OC对象
retain 释放旧值,增加新值的retaincount,适合处理对象和无垃圾回收器时使用。在有垃圾回收器时,和assign效果相同。所以retain比assign更适合广泛的情况,有无垃圾回收器都可以使用。
copy
它指出,在赋值时使用传入值的一份拷贝。拷贝工作由copy方法执行,此属性只对那些实行了NSCopying协议的对象类型有效。更深入的讨论,请参考“复制”部分。
3.原子性 原子性提供了线程安全。加了atomic就代表给方法加锁。nonatomic代表方法不需要考虑线程安全问题。atomic是要消耗一定的性能。默认所有的property属性都是atomic。但我们在实际用的时候基本大部分是用nonatomic!
4.另:
@property (nonatomic,getter = isRich)BOOL rich;
这是在指定getter要调用的方法,同理,setter方法也可以这么玩。