修饰词用法
ARC:assign、weak、strong、copy
MRC:assign、retain、copy、nonatomic、atomic
assign : 赋值
1.直接赋值,例如:int, float...等使用
2.没用使用其他(weak, strong,copy,retain)时,默认为assign修饰
3.对象使用assign,计数器不会+1(与strong的区别);当对象销毁时,指针不指向nil,会出现野指针(与weak的区别)
weak:弱
1.弱指针,修饰对象使用,不可用于数据类型(int,float...)
2.weak修饰时,计数器不会+1,直接赋值
3.weak是为了打破循环应用而生,常用于修饰Block,不会对block内的使用对象的引用计数+1,因此不会导致内存泄漏
4.他的引用对象被销毁时,指针会指向nil,不会出现野指针
strong:强
1.强指针,直接赋值,并且计数器+1
2.在ARC中代替了retain的作用
retain:保持
1.release 旧对象( 旧对象计数器 -1 ) , retain 新对象( 新对象计数器 +1 ) , 然后指向新对象 .
2.set方法如下:
if(_some != nil){
[_some release];
};
_some = [some retain];
copy:拷贝
1.copy 在 MRC 时是这样做的 release 旧对象( 旧对象的引用计数器 -1 ) , copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象 .(新对象是指最终指向的那个对象,不管深拷贝还是浅拷贝)
if (_dog != nil)
{
[_dog release];
}
_dog = [dog copy];
2.copy 在 ARC 时是这么干的 copy 新对象( 新对象的引用计数器 +1 ) , 然后指向新对象
_dog = [dog copy];
3.修饰的属性本身要不可变的。例如 NSMutableArray 采用 copy 修饰 , 在addObject时会出现Crash, 因为NSMutableArray的对象在copy 过后就会变成NSArray。如果需要copy NSMutableArray对象,用:mutablecopy。
nonatomic:非原子属性
1.不对set方法加同步锁 .
2.性能好
3.线程不安全
atomic :原子属性
1.原子属性就是对生成的 set 方法加互斥锁 @synchronized(锁对象) .
@synchronized(self) { _delegate = delegate;}
2.需要消耗系统资源 .
3.互斥锁是利用线程同步实现的 , 意在保证同一时间只有一个线程调用 set 方法 .
4.其实还有 get 方法 , 要是同时 set 和 get 一起调用还是会有问题的 . 所以即使用了 atomic 修饰 还是不够安全 .
readonly (只读)
1.让 Xcode 只生成get方法 .
2.不想把暴露的属性被人随便替换时 , 可以使用 .
readwrite (读写)(默认)
1.让 Xcode 生成get/set方法 .
2.不用 readonly 修饰时 , 默认就是 readwrite .