属性关键字的作用
现在我们iOS开发中,基本都是使用ARC(自动引用计数)技术,来编写我们的代码。因此在属性property中我们经常使用的关键字有strong,weak,assign,copy,nonatomic,atomic,readonly,readwrite,getter,setter。可能经常写代码的朋友,已经很清楚在什么情况下会使用他们。但可能并不清楚他们的含义,下面我先通过一张表总结下他们的作用:
属性关键字的作用 | |
属性关键字 | 对属性的作用 |
strong | 释放旧对象 将旧对象的值赋予输入对象 ,再提高输入对象的索引计数为 1 ,常使用在继承自 NSObject 的类。 |
weak | weak 不增加对对象的引用计数,也不持有对象,因此不能决定对象的释放。它比 assign 多了一个功能,当对象消失后自动把指针变成 nil |
assign | 简单赋值 ,不更改索引计数 ,适用于基础数据类型( NSInteger CGFloat )和 C 数据类型( int float double char 等)简单数据类型。 |
copy | 建立一个索引计数为 1 的对象 然后释放旧对象 对 NSString 它指出 ,在赋值时使用传入值的一份拷贝 ,拷贝工作由 copy 方法执行,此属性只对那些实行了 NSCopying 协议的对象类型有效。 |
atomic | 和 nonatomic 用来决定编译器生成的 getter 和 setter 是否为原子操作 , atomic 设置成员变量的 @property 属性时 默认为是 atomic 提供线程安全 。在多线程环境下 ,原子操作是必要的 否则会引起错误的结果 。 |
nonatomic | 非原子性访问 对于属性赋值的时候不加锁 ,多线程并发访问会提高性能,如果不加此属性 则默认是两个访问方法都为原子型事务访问。 |
readonly | 此标记说明属性是只读的 |
readwrite | 此标记说明属性会被当成读写的 这也是默认的属性 |
unsafe_unretained | 跟 weak 类似,声明一个弱引用,但是当引用计数为 0 时,变量不会自动设置为 nil |
getter | 指定 get 方法,并需要实现这个方法 。必须返回与声明类型相同的变量,没有参数 |
setter | 指定 set 方法,并需要实现这个方法 。带一个与声明类型相同的参数,没有返回值(返回空值) 当声明为 readonly 的时候,不能指定 set 方法 |