现在开发中,基本是使用ARC(自动引用计数)技术,来编写我们的代码。因此在属性property中我们经常使用的关键字有strong,weak,assign,copy,nonatomic,atomic....等。可能大家都知道他的用法,但却不是很清楚他们的含义,下面我总结一下它们。
属性关键字含义
strong 释放旧对象将旧对象的值赋予输入对象,再提高输入对象的索引计数为1,此关键字经常使用。
weak 不增加引用计数,不持有对象,因此也不能决定对象释放 对比assign 的一个好处是,当对象消失时指针自动归为nil
assign 适用于基础数据类型(NSInteger CGFloat...)不增加引用计数
copy 建立一个索引计数为1 的对象然后释放旧对象 此属性只对那些实行了NSCopying协议的对象类型有效(NSString , Block)
atomic 和 nonatomic用来决定编译器生成的getter和setter是否为原子操作,atomic 设置成员变量的@property属性时 默认为是atomic 提供线程安全。
nonatomic 非原子性访问对于属性赋值的时候不加锁,多线程并发访问会提高性能,如果不加此属性则默认是两个访问方法都为原子型事务访问。
readonly 此标记说明属性是只读的
readwrite 此标记说明属性会被当成读写的 这也是默认的属性
unsafe_unretained 跟weak类似,声明一个弱引用,但是当引用计数为0时,变量不会自动设置为nil(ios5加入的 我基本没用过)
1.assign的情况: NSString * myHouse = [ houseOfMM assign ];
此时 myHouse 和 houseOfMM 完全相同,地址都是 0XAAAA ,内容为 0X1111 ,即 myHouse 只是 houseOfMM 的别名,对任何一个操作就等于对另一个操作。因此 retainCount 不需要增加.(同进同出,关系好,一把钥匙,给我拿着)
2.retain的情况: NSString * myHouse = [ houseOfMM retain ];
此时 myHouse 的地址不再为 0XAAAA ,可能为 0XAABB ,但是内容依然为 0X1111 .因此 myHouse 和 houseOfMM都可以管理' 装梵几的三室两厅 '所在的内存。因此 retainCount 需要增加1.(有些独立,各自进出,两把钥匙)
3.copy的情况: NSString * myHouse = [ houseOfMM copy ];
此时会在堆上重新开辟一段内存存放@'MM的三室两厅',比如0X1122,内容为@'MM的三室两厅',同时会在栈上为myHouse分配空间,比如地址:0XAACC,内容为0X1122,因此retainCount增加1供myHouse来管理0X1122这段内存.(两套@'装梵几的三室两厅',条件好,分居了,房子一人一套,所以钥匙一人一把。)
属性关键字对比
copy : strong 1.copy建立一个同样的对象 比如一个NSString 地址为0x1212 内容 @“121” copy到另一个NSString上 地址改变 而内容不变 新对象retain +1 就对象不变 也就是说copy时内容拷贝 而 strong不是他只是单纯的生命一个变量 retain为1 2.strong的set方法时浅拷贝 copy的set为深拷贝
assign : weak 在MRC环境下使用使用assign实现基本类型. 在ARC环境下,weak相当于assign 个人感觉weak比assign要强大的地方在 weak可以避免循环引用 , 同时当对象不存在时候可以将其置为nil