copy,mutableCopy 理解

来源:未知 责任编辑:责任编辑 发表时间:2013-12-18 11:33 点击:
copy,mutableCopy 理解 p>好记性不如烂笔头,好理解不如写出来,前一句非常正确,后一句是我加的,嘿嘿。

p>突击学习了下2者的却别,记录如下。

p>OC中可变对象和不可对象经常用的如下:

p>NSString, NSMutableString,| NSArray,NSMutableArray,

p>分开说:

p>A:NSString, NSMutableString

p>2者的copy方法返回类型为:

p>[NSString copy]               指针复制,返回的对象的地址和方法的接收者一样,引用计数加1

p>[NSMutableString copy]        深复制,重新Alloc一个 NSString 的对象,并返回。返回对象的地址和方法接收者的地址不一样,并且方法接受者的内容改变不影响返回对象,同时返回对象的内容不可以改变。

p> 

p>在这再说一下NSString 的copy 和retian。看到上面[NSString copy] 的解释和retain的使用没区别,为啥还需要2个,当时迷糊了下,分析后发下还是不一样的。

p>@property mString;

p>1:如果mString set 时为一个NSMutableString

p>   copy 属性,当set的对象内容修改时,不影响mString

p>   retian 属性,当set的对象内容修改时,mString的内容发生变化。

p>2:如果mString set时的对象为NSString

p>    不论是copy属性还是retain属性,因为set时对象为NSString,内容可能发生变化,所以使用任何一种属性达到的结果是一致的。

p>所以NSString在选择用retain 还是 copy 时,需要考虑到set的对象如果内容发生变化,需不需要影响到自己,如需则retain,如不需则copy。但是建议还是最好都是用copy,这样逻辑清晰,便于问题查找。

p>2者的MutableCopy方法返回的类型为:

p>[NSString mutableCopy]        深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。

p>[NSMutableString mutableCopy]  深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。

p> 

p>B: NSArray,NSMutableArray

p>2者的copy方法返回类型为:

p>[NSArray copy]         指针复制,返回的对象的地址和方法的接受者的地址一样,引用计数加1,同时array里面的对象的地址都是一样的

p>[NSMutableArray copy]  “false深复制” 重新Alloc一个 NSArray对象,并返回,返回对象的地址和方法接收者的地址不一样,并且方法接受者本身内容(曾、减等操作,非包含对象内容的变化)改变不影响返回对象,同时返回对象的内容不可以改变。同时array里面的对象的地址都是一样的。

p>比如:

p>NSArray *srcArray = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];

p>NSMutableArray *arrMCopy = [srcArray mutableCopy];

p> 

p>NSArray        *arrCopy = [srcArray copy];

p> 

p>(lldb) p srcArray

p> 

p>(NSArray *) $2 = 0x0cf667c0 @"3 objects"

p>(lldb) p arrCopy

p> 

p>(NSArray *) $0 = 0x0cf667c0 @"3 objects"

p> 

p>(lldb) p arrMCopy

p> 

p>(NSMutableArray *) $1 = 0x0d077ab0 @"3 objects"

p> 

p>2者的MutableCopy方法返回的类型为:

p>[NSArray mutableCopy]          “false深复制” 重新Alloc一个NSMutableArray 并返回,返回对象的地址和方法接收者的地址不一样,并且2者的本身对象的增加,删除等操作不影响另一者。同时array里面的对象的地址都是一样的
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • cocos2d-x学习笔记(19)--label 、label atlas
  • cocos2d-x学习笔记(23)--地图的使用3--CCTMXLayer
  • Cocos2d-x学习(一):HelloWorld
  • cocos2dx在xcode下开发,编译到android上(2)
  • cocos2d 设置屏幕默认方向
  • Cocos2d-x 2.0 之 Actions “三板斧” 之一
  • cocos2d-x学习笔记(22)--地图的使用2(TMX) --Z-Order、AnchorPoi
  • cocos2d-x学习笔记(18)--游戏打包(windows平台)
  • cocos2d-x学习笔记(16)--spritesheet(精灵表单)
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1