博文由本人原创或者借鉴别人的好文章修改而成,如有不当欢迎指正。
assign:简单赋值,不更改引用计数。
使用:对基础数据类型(NSInteger,CGFloat)和C数据类型(int, float,double,char等等)。
copy:建立一个索引计数为1的对象,然后释放旧对象 。
使用:对NSString
weak:对象销毁之后会自动置为nil,防止野指针。Assign不能自动置为nil,需要手动置为nil。 Delegate基本总是使用weak,以防止循环引用。特殊情况是,希望在dealloc中调用delegate的某些方法进行释放,此时如果使用weak将引起异常,因为此时已经是nil了,那么采用assign更为合适。
PS:weak好像只适用于object类型。
strong:与retain相同。
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1.
使用:对其它NSObject及其子类。
retain的实际语法为:
- (void)setName:(NSString *)newName {
if (name != newName) {
[name release];
name = [newName retain];
// name’s retain count has been bumped up by 1
}
}
nonatomic:非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。
atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。
atomic
设置成员变量的@property属性时,默认为atomic,提供多线程安全。
在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。加了atomic,setter函数会变成下面这样:
{lock}
if (property != newValue) {
[property release];
property = [newValue retain];
}
{unlock}
nonatomic
禁止多线程,变量保护,提高性能。
atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。