Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copymutableCopy 的区别以及相关用法。
Objective - C 中可变对象和不可对象经常用的如下:
NSString、 NSMutableString | NSArray、NSMutableArray,
分开说:
A:NSString、 NSMutableString
二者的copy方法返回类型为:
[NSString copy]                         浅拷贝,指针复制,返回的对象的地址和方法的接收者一样,引用计数加1。
[NSMutableString copy]              深拷贝, 深复制,重新 Alloc 一个 NSString 的对象,并返回。返回对象的地址和方法接收者的地址不一样,并且方法接受者的内容改变不影响返回对象,同时返回对象的内容不可以改变。
二者的MutableCopy方法返回的类型为:
[NSString mutableCopy]             深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。
[NSMutableString mutableCopy]  深复制,重新Alloc一个NSMuatbleString,并返回。返回对象的地址和方法接收者的地址不一样,2者的内容改变不影响另一者,同时返回对象的内容可以改变。
附:浅拷贝和深拷贝的区别
浅拷贝,父对象独立,子对象共享。
深拷贝,父对象独立,子对象独立。
B: NSArray、 NSMutableArray
二者的copy方法返回类型为:
[NSArray copy]         指针复制,返回的对象的地址和方法的接受者的地址一样,引用计数加1,同时array里面的对象的地址都是一样的。
[NSMutableArray copy]  “false深复制” 重新Alloc一个 NSArray对象,并返回,返回对象的地址和方法接收者的地址不一样,并且方法接受者本身内容(增、减等操作,非包含对象内容的变化)改变不影响返回对象,同时返回对象的内容不可以改变。同时array里面的对象的地址都是一样的。

NSArray *srcArray = [NSArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSMutableArray *arrMCopy = [srcArray mutableCopy]; NSArray *arrCopy = [srcArray copy]; (lldb) p srcArray (NSArray *) $ = 0x0cf667c0 @"3 objects"
(lldb) p arrCopy (NSArray *) $ = 0x0cf667c0 @"3 objects" (lldb) p arrMCopy (NSMutableArray *) $ = 0x0d077ab0 @"3 objects"
二者的MutableCopy方法返回的类型为:
[NSArray mutableCopy]          “false深复制” 重新Alloc一个NSMutableArray 并返回,返回对象的地址和方法接收者的地址不一样,并且2者的本身对象的增加,删除等操作不影响另一者。同时array里面的对象的地址都是一样的。
[NSMutableArray mutableCopy]     “false深复制” 重新Alloc一个NSMutableArray 并返回,返回对象的地址和方法接收者的地址不一样,并且2者的本身对象的增加,删除等操作不影响另一者。同时array里面的对象的地址都是一样的。
 
总结:
1:对于不可变对象,copy都是浅复制,即指针复制。mutableCopy 都是Alloc一个新对象返回。
2:对于可变对象,copy和mutableCopy都是Alloc新对象返回。
3:不论是可变还是不可变对象,copy返回的对象都是不可变的,mutableCopy返回的对象都是可变的。
4:容器类对象,不论是可变的还是不可变的,copy,mutableCopy返回的对象里所包含的对象的地址和之前都是一样 的,即容器内对象都是浅拷贝。

对copy、mutableCopy理解的更多相关文章

  1. iOS copy&mutableCopy理解

    Copy&mutableCopy   通过copy方法可以创建可变或不可变对象的不可变副本,通过mutableCopy可以创建可变或不可变对象的可变副本. 拷贝分为浅拷贝和深拷贝: 浅拷贝:指 ...

  2. copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)

    写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...

  3. objective c,copy, mutableCopy区别

    copy总是返回不能被修改的对象,mutableCopy返回可以被修改的对象 例: NSArray *array = @[@"test", @"test2"]; ...

  4. NSString NSMutableString copy mutableCopy retain weak strong整合

    copy retain assign的差别在于对象属性的set方法 NSString 与 NSMutableString NSString是不可变字符串对象,这句话的意思,结合代码: #import ...

  5. iOS开发之Copy & MutableCopy及深复制 & 浅复制

    1.使用copy或mutableCopy方法可以创建一个对象的副本. copy: (1)需要实现NSCoppying协议 (2)创建的是不可变副本(如NSString.NSArray.NSDictio ...

  6. python的copy模块理解

    首先直接上结论: —–我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在.所以改变原有被复制对象不会对已经复制出来的新对象产生影响. —–而浅复制并不会产生一个独立的对 ...

  7. OC copy mutableCopy, 浅拷贝,深拷贝

    copy与mutableCopy都是深拷贝,区别是mutableCopy拷贝出的对象是可变的. OC对象基本都是通过指针访问,所以一般情况下,通过对指针的赋值都是浅拷贝,即只是拷贝了一份对象的指针,对 ...

  8. iOS开发-retain/assign/strong/weak/copy/mutablecopy/autorelease区别

    依旧本着尊重原创和劳动者的原则,将地址先贴在前面: http://www.cnblogs.com/nonato/archive/2013/11/28/3447162.html,作者Nonato 以下内 ...

  9. 深浅Copy的理解

    在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝. 而对象又分为两种,一种是不可变对象(字符串.元组.数字 ),一种是可变对象(列表.字典). 而深浅拷贝有三种情况:拷贝的是不可变对象.拷 ...

随机推荐

  1. Python 和 R 数据分析/挖掘工具互查

    如果大家已经熟悉python和R的模块/包载入方式,那下面的表查找起来相对方便.python在下表中以模块.的方式引用,部分模块并非原生模块,请使用 pip install * 安装:同理,为了方便索 ...

  2. SLAM前端技术选择思考

    以前是专门做室内定位技术研究的,先后学习和分析了多种基于电磁的室内定位技术,如WiFi指纹定位(先后出现过RSSI.CTF.CIR多种指纹特征).WiFi ToF定位.低功耗蓝牙BLE以及iBeaco ...

  3. 【Android】实现打开关闭效果

    最近抽时间学习一下Android,做个笔记: 布局xml: <LinearLayout android:id="@+id/date_label" android:layout ...

  4. JavaScript 的 defer 与 async

    当解析器遇到 script 标签时,文档的解析将停止,并立即下载并执行脚本,脚本执行完毕后将继续解析文档.但是我们可以将脚本标记为 defer,这样就不会停止文档解析,等到文档解析完成才执行脚本,也可 ...

  5. hdu 4585 Shaolin treap

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Problem ...

  6. Sublime相关

    通过添加 Build System 的方式来使 Sublime Text 3 运行 JS.ES6: 参考文章:如何优雅地使用Sublime Text3 参考书目:<ES6标准入门>阮一峰 ...

  7. 利用FlashPaper在web页面中显示PDF文件(兼容各浏览器)

    应项目需求要把PDF内嵌到网页中显示,其中有了很多办法,比如用<embed/>元素放入PDF文件,但是效果不理想,浏览器兼容不理想,在ie9/8(其他版本没有测试)显示会提示下载pdf文件 ...

  8. monkey 自己总结

    adb shell monkey -p com.test.smstest --pct-touch 50 --pct-motion 30 --pct-nav 20 -s 10 -v --throttle ...

  9. java appium api

    Appium中部分api的使用方法,有需要的朋友可以参考下. 使用的语言是java,appium的版本是1.3.4,java-client的版本是java-client-2.1.0,建议多参考java ...

  10. no route to host

    防火墙没有关闭: systemctl stop firewalld