首页 > 移动平台 > 详细

iOS开发知识点:理解assign,copy,retain变strong

时间:2015-07-03 21:56:05      阅读:334      评论:0      收藏:0      [点我收藏+]

 

 

一、.h和.m文件的变化说明

 

1.对于.h头文件,主要是将属性定义由retain变为strong

 

 

 

  1. @property (retain, nonatomic)  

变为

 

 

  1. @property (strong, nonatomic)  


2.在ARC之前,我们经常在.m中使用分类拓展来增加私有的property

 

 

  1. @interface MJViewController ()  
  2. @property (nonatomic, retain) NSArray *data;  
  3. @end  

这 样做主要是简化实例对象的手动内存管理,让property的setter方法自动管理原来对象的释放,以及新对象的retain。但是有了ARC,这样 的代码就不再需要了。一般来说,仅仅为了简化内存管理,是不再需要使用property的,虽然你仍然可以这样做,但直接使用实例变量是更好的选择。只有 那些属于public的实例变量,才应该定义为property

我们可以直接在.m类实现中定义private实例变量,不必写分类拓展了:

 

 

 

  1. @implementation MJViewController {  
  2.     NSArray *data;  
  3. }  

不过还是要在viewDidUnload方法中将data设置为nil,因为data是个strong指针,当不再使用一个对象时,应该设置为nil

 

 

  1. - (void)viewDidUnload {  
  2.     [super viewDidUnload];  
  3.     data = nil;  
  4. }  


二、IBOutlet

在ARC中,所有IBOutlet属性都推荐使用weak, 这些view对象已经属于View Controller的view hierarchy,不需要再次定义为strong。因此,这些定义为weak的IBOutlet属性都不需要在IBOutlet中设置为nil

 


 

三、@property的修饰符小结

 

• strong : 该属性值对应 __strong 关键字,即该属性所声明的变量将成为对象的持有者,等同于"retain"
• weak : 该属性对应 __weak 关键字,与 __weak 定义的变量一致,该属性所声明的变量将没有对象的所有权,并且当对象被释放之后,对象将被自动赋值nil,记住IBOutlet应该使用weak
• unsafe_unretained : 等效于__unsafe_unretaind关键字声明的变量,等同于之前的"assign",iOS 5之前的系统用该属性代替 weak 来使用
• copy : 和之前的copy一样,复制一个对象并创建strong关联
• assign : 对象不能使用assign,但原始类型(BOOL、int、float)仍然可以使用

 


 

举个例子:

    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://wenku.baidu.com/view/ab6ed804bed5b9f3f90f1c7d.html


有空的话翻译一下好嘛:


http://clang.llvm.org/docs/AutomaticReferenceCounting.html


https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html


http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html


先看这个 :

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开发知识点:理解assign,copy,retain变strong

原文:http://www.cnblogs.com/A--G/p/4619607.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!