objective-c 属性限定符

来源:互联网 发布:淘宝卖家 延长收货 编辑:程序博客网 时间:2024/05/01 20:27

昨天被一个学弟问道性能优化的问题,我就随口说了句加属性限定符strong、weak什么的,他问我具体什么时候要用strong什么时候要用weak,我就说用系统默认好了,如xib默认的是weak,创建全局变量时候要用strong,非对象时(NSInteger、BOOL等)用assign。
后来发现自己解释的太肤浅了,今天特地查书记录在这里,一会给他看看,估计面试的时候也会经常用到。

  • assign:意味着不保留实例变量,也不在销毁前将其设置为nil。与ARC的限定符_unsafe_unretained相同。这是非对象(int、BOOL、NSInteger等)属性的默认设置。

  • copy:保留并释放实例变量,并在销毁前将其设置为nil。另外,设置实例变量时将进行复制,而不是直接将指针赋值给实例变量。它将实例变量设置为ARC所有权strong。

  • strong:保存并释放实例变量,并在销毁前将其设置为nil。对象属性的默认设置。

  • weak:不保留实例变量,但在销毁前自动将其设为nil。

  • readonly/readwrite:默认设置为readwrite,让编译器为实例变量创建get方法和set方法,限定符readonly让编译器只能生成get方法。没有只生成set方法的限定符。

  • atomic和nonatomic:默认为atomic,命令编译器提供多线程安全。在多线程环境下,原子操作是必要的,否则有可能引起错误的结果。nonatomic禁止多线程,变量保护,提高性能。 atomic是Objc使用的一种线程保护技术,基本上来讲,是防止在写未完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iPhone这种小型设备上,如果没有使用多线程间的通讯编程,那么nonatomic是一个非常好的选择。

    指出访问器不是原子操作,而默认地,访问器是原子操作。这也就是说,在多线程环境下,解析的访问器提供一个对属性的安全访问,从获取器得到的返回值或者通过设置器设置的值可以一次完成,即便是别的线程也正在对其进行访问。如果你不指定 nonatomic ,在自己管理内存的环境中,解析的访问器保留并自动释放返回的值,如果指定了 nonatomic ,那么访问器只是简单地返回这个值。

0 0
原创粉丝点击