码迷,mamicode.com
首页 > 移动开发 > 详细

iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

时间:2015-07-16 11:35:44      阅读:197      评论:0      收藏:0      [点我收藏+]

标签:

readwrite:是可读可写特性,需要生成getter和setter方法;
readonly是之都特性,只会生成getter方法,不会生成setter方法,不希望属性在类外改变时候使用;
alloc 对象分配后引用计数为1retain 对象的引用计数+1

 

copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变
assign:是赋值特性,setter方法将传入参数赋值给实例变量(一把钥匙,同进同出);用于基础数据类型;
weak:由ARC引入的对象变量的属性,比assign多了一个功能,对象消失后把指针置为nil,避免了野指针(不是null指针,是指向“垃圾”内存(不可用的内存)的指针);
retain:表示持有特性,setter方法将传入参数先保留,后赋值(两把钥匙,各自进出),传入参数的retaincount加1;
strong:ARC引入,等同于retain;
copy:表示赋值特性,setter方法将传入对象复制一份;需要完全一个新的对象时候(两套房子,两把钥匙);
nonatomic:非原子操作,决定编译器生成setter和getter方法是否原子操作,不加同步,多线程访问提高性能,
__unsafe_unretain:对象引用不会加1,对象释放后,不会置为nil,可能造成野指针,尽量少用。
autorelease:对象引用计数-1 如果为0不马上释放,最近一个个pool时释放

 

举个例子:

    NSString *houseOfMM = [[NSString alloc] initWithString:‘装梵几的三室两厅‘];  

上面一段代码会执行以下两个动作:  
1 在堆上分配一段内存用来存储@‘ 装梵几的三室两厅 ‘ ,比如:内存地址为 0X1111  内容为 ‘ 装梵几的三室两厅‘ ,  
2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111    


下面分别看下(assign,retain,copy):  
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 ];  

此时会在堆上重新开辟一段内存存放@‘装梵几的三室两厅‘,比如0X1122,内容为@‘装梵几的三室两厅‘,同时会在栈上为myHouse分配空间,比如地址:0XAACC,内容为0X1122,因此retainCount增加1供myHouse来管理0X1122这段内存.(两套@‘装梵几的三室两厅‘,条件好,分居了,房子一人一套,所以钥匙一人一把。)

 

什么时候用assign,当然是破房子,简装的房子拉
基础类型(简单类型,原子类型):NSInteger,CGPoint,CGFloat,C数据类型(int,float,double,char等)


什么时候用copy
含有可深拷贝的mutable子类的类,如NSArray,NSSet,NSDictionary,NSData的,NSCharacterSet,NSIndexSet,NSString
(可深度拷贝的房子)
但是NSMutableArray这样的不可以,Mutable的不能用copy,不然初始化会有问题。切记

什么时候用retain
其他NSObject和其子类对象好嘛 (大多数)


ARC中的strong相当于非ARC中的retain,ARC来了以后多搞一把钥匙就strong了啦。

 

参考这个 : 

http://blog.csdn.net/favormm/article/details/7023322 

http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/ 

http://www.crifan.com/object_c_property_setter_assign_retain_copy_weak_strong/

iOS学习笔记-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

标签:

原文地址:http://www.cnblogs.com/chenjundb/p/4650404.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!