Objective C - 属性对比

MRC:

retain:适用继承于NSObject类的对象类型。释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的引用计数为1。

assign:适用基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)。简单赋值,不更改对象的引用计数。

ARC:

strong(强引用):等同于retain,但在block声明时和retainyou 区别。

weak(弱引用):适用代理的声明。

copy(深拷贝、浅拷贝):适用NSString类型和block类型。

atomic和nonatomic:

atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

retain和strong的区别:

在声明block时,strong相当于copy,retain相当于assign。

assign和strong的区别:

在声明block时,strong相当于copy,retain相当于assign。

assign和weak的区别:

在ARC中,在有可能出现循环引用的时候,往往要通过让其中一端使用weak来解决;自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用weak。

assign 可以用非OC对象,而weak必须用于OC对象。

weak 此特质表明该属性定义了一种“非拥有关系” (nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。

而 assign 的“设置方法”只会执行针对“纯量类型”(scalar type,例如 CGFloat 或 NSlnteger 等)的简单赋值操作。

strong强引用和weak弱引用的区别:

(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放  ,即使还有weak型指针指向它。

一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。

深拷贝和浅拷贝:

用@property声明 NSString、NSArray、NSDictionary 经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

    原文作者:捕梦少女的梦想
    原文地址: https://www.jianshu.com/p/652a7ee42776
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞