iOS进阶之@property属性关键字

nonatomic和atomic区别

在默认情况下,由编译器所合成的方法(setter 和 getter)会通过锁定机制来确保其原子性。系统默认使用的是atomic这个属性,这个属性会为setter 和 getter 方法进行加锁来确保线程安全的(有可能会出现多条线程来同时访问这一个数据)。

atomic 原子性 线程安全的系统会默认给atomic修饰的属性的setter和getter方法进行加锁。

nonatomic 非原子性 线程不安全的系统不会给atomic修饰的属性的setter和getter方法进行加锁。

注意:虽然atomic是线程安全的但我们平时用到的大多数属性都是用nonatoic来修饰的,因为atomic虽然是线程安全的,但系统会默认给atomic修饰的属性加锁,而加锁会影响系统的性能,我们一般使用的还是nonatomic,在开发过程中应尽量避免多条线程来访问同一个属性。如果我们不写这2个关键字中的任何一个,则系统默认生存的是atmoic。

readwrite

用readwrite修饰的属性系统会自动生存setter和getter方法

readonly

应readonly修饰的属性系统不会生存setter方法只会生成getter方法

assign

一般用来修饰基本数据类型只进行简单的赋值操作比如int float double CGFloat

strong

强引用,一般用来修饰对象,该关键字修饰的属性在设置新值时,设置方法会先保留新值,并释放旧值,然后再讲新值设置上去。

weak

弱引用,一般用来修饰对象,该关键字修饰的属性在设置新值时,设置方法既不先=保留新值,并=也不释放旧值,此特性和assign类似,然而在属性所指定的对象遭到释放时,属性值也会清空nil

unsafe_unretained

此特质的语义和assign形态,但它适用于对象类型,然而在属性所指定的对象遭到释放时,此属性值不会清空nil,有可能会造成野指针错误。

copy

此关键字和strong类型,然而设置方法并不保留新值,而是将其copy。当属性类型为NSString *时,经常使用此特别来保护其封装性,因为传递给设置方法的新值有可能是一个NSMutableString 类的实例。这个类是NSString的之类,表示一种可以修改的字符串,此时若不拷贝字符串,那么设定万属性之后,字符串的值就有可能会在对象不知情的情况下遭人修改。所以就要拷贝一份不可变的字符串,来确保对象中的字符串值不会无意间变动。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,828评论 8 265
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 13,799评论 1 32
  • OC语言基础 1.类与对象 类方法 OC的类方法只有2种:静态方法和实例方法两种 在OC中,只要方法声明在@int...
    奇异果好补阅读 9,792评论 0 11
  • //// @property 、属性、修饰符// Created by mac on 2016/10/30./...
    甘哲157阅读 5,513评论 1 8
  • 昨天早上,再一次把手机掉在了地上,这次是手机的左上角着的地,左上角屏烂了个小纹纹,和往常一样拾起没有在意,当去用时...
    艾琳237阅读 3,526评论 1 0