修饰词用法

2020-09-16  本文已影响0人  quanling

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 .

上一篇下一篇

猜你喜欢

热点阅读