美文网首页
assign,copy,retain,strong,weak

assign,copy,retain,strong,weak

作者: 百思不得解 | 来源:发表于2016-04-15 11:01 被阅读0次

    strong&weak

    http://www.jianshu.com/p/2a2e1f0849ef

    assign,retain&copy

    举个例子:

    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了啦。

    相关文章

      网友评论

          本文标题:assign,copy,retain,strong,weak

          本文链接:https://www.haomeiwen.com/subject/msknlttx.html