1.assign
是简单的值传递,没有retaincount.对于基础数据类型和C数据类型,id等非指针类型用这个。
2.retain
释放之前的对象(指针清空),再指定新的指针地址,同时 retainCount+1.
-(void) setName:(NSString *) newName {
if(name!=newName) {
[name release]; /指针清空
name = [newName retain];
}
}
3.copy
针对NSString使用,确保不受NSMutableString 影响。
4.weak
需要在启动ARC的情况下使用,和 assign 相同,但是也有一点不同之处。
5.strong
相当与retain
6.readonly与readwrite
没有setter。不能赋值。readwrite 既有read 又有write。
7.nonatomic
非安全性访问,效率高。一般用这个。
8.atomic
访问器是原子操作,在多线程环境下安全访问属性。
说明:
默认所有实例变量和局部变量都是Strong指针。
声明IBOutlet 一般用weak.
什么是野指针。当使用weak时,retainCount 没有加1.或者说对象的所有者数量没有改变
当所有者没有了,对象会被清空。对于weak 声明的这个指针指向的是地址将重置为nil.
而如果是assign 则需要手动设置为nil,否则将产生野指针。
这就是weak 和 assign 的一点点区别。
delegate 通常也是weak属性。
通常viewController 拥有 通用类,譬如UITabelView 之类的。而在通用类中具有协议属性,这个属性声明是weak,并且指向了
viewController.