OC copy mutableCopy, 浅拷贝,深拷贝
copy与mutableCopy都是深拷贝,区别是mutableCopy拷贝出的对象是可变的。
OC对象基本都是通过指针访问,所以一般情况下,通过对指针的赋值都是浅拷贝,即只是拷贝了一份对象的指针,对象还是只有一个。
例:
NSMutableString *str = [NSMutableString stringWithString:@"abc"];
NSString *str2 = str;
str与str2指向的是同一个对象,str变了str2随之改变。
NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];
NSArray *array2 = array;
array1与array2指向的是同一个对象,array对象的内存地址相同,array1变了array2随之改变。这里有一个注意点,array2中存的仍是obA,obB,obC,只不过会把他们的引用计数加一。
深拷贝:
NSMutableString *str = [NSMutableString stringWithString:@"abc"];
NSString *str2 = [str copy];
str与str2指向的是不同的对象,str变了str2不会变。
NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];
NSArray *array2 = [array copy];
array1与array2指向的是不同的对象,array对象的内存地址不同(注意,内部obA,obB,obC的内存地址相同),array1变了array2不会变,这里的变指的是array中的元素增加或减少,假设array1少了一个obC,array2中仍是obA,obB,obC。同样有一个注意点,array2中存的仍是对象的指针obA, obB, obC, 只不过他们的引用计数会加一,这时如果obA的某个属性变了,那么array2中obA的某个属性也会跟着变,原因很简单,因为这两个obA就是同一个对象。所以这里的深拷贝只是指针级的深拷贝。
所以如果想做到内容级的深拷贝,一种方法是手动对array中每一个对象执行copy操作,然后加到新数组中,前提是array中的对象都支持copy协议。
例:
NSMutableArray *array1 = [NSMutable arrayWithObjects:obA, obB, obC];
NSMutableArray *array2 = [[NSMutableArray alloc] init];
for(id ob in array1) {
id obCopy = [ob copy];
[array2 addObject:obCopy];
}
这种情况下不论是array对象还是array中的内容被拷贝完都是两份,所以array1中无论是数组内容增加减少,或者其中的对象obA的某个属性改变,对array2中的元素都没有影响。不过实际代码中这种情况比较少,自己的项目经历中貌似只有一个冬奥会轮播图的控件中用到过。
mutaleCopy 与copy的区别也很简单,mutable么就是可变的,所以mutableCopy拷贝出来的都是可变的对象(通常为NSMutableString, NSMutableArray, NSMutableDictionary),copy拷贝出来的是不可变的对象。
OC copy mutableCopy, 浅拷贝,深拷贝的更多相关文章
- copy&mutableCopy 浅拷贝(shallow copy)深拷贝 (deep copy)
写在前面 其实看了这么多,总结一个结论: 拷贝的初衷的目的就是为了:修改原来的对象不能影响到拷贝出来得对象 && 修改拷贝出来的对象也不能影响到原来的对象 所以,如果原来对象就是imm ...
- OC Copy and MutableCopy的使用
#import <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> // copy代表set ...
- iOS copy&mutableCopy理解
Copy&mutableCopy 通过copy方法可以创建可变或不可变对象的不可变副本,通过mutableCopy可以创建可变或不可变对象的可变副本. 拷贝分为浅拷贝和深拷贝: 浅拷贝:指 ...
- Python中的浅拷贝 深拷贝
浅拷贝只拷贝父对象,子对象的地址空间不改变,包括下面三种: 1. copy 从下面的例子可以看出对象c从a拷贝,当对象a增加一个列表元素之后,c对象没有改变, 而当对象a中的子列表改变时,对象c的子列 ...
- Python__学习路上的坑之--引用,浅拷贝,深拷贝
copy : 相当于只是拷贝表面一层,如果里面还有深层次的引用,那么也是直接拷贝引用的地址,而且如果拷贝对象是不可变类型比如元组,那么也是直接拷贝引用. deepcopy: 无论是拷贝可变类型还是不可 ...
- Python深入:02浅拷贝深拷贝
对象赋值实际上是简单的对象引用.也就是说当你创建一个对象,然后把它赋给另一个变量的时候,Python并没有拷贝这个对象,而只是拷贝了这个对象的引用. 假设想创建一对小夫妻的通用档案,名为person. ...
- JS中有关对象的继承以及实例化、浅拷贝深拷贝的奥秘
一.属性的归属问题 JS对象中定义的属性和方法如果不是挂在原型链上的方法和属性(直接通过如类似x的方式进行定义)都只是在该对象上,对原型链上的没有影响.对于所有实例共用的方法可直接定义在原型链上这样实 ...
- $.extend()浅拷贝深拷贝
参考网址:http://bijian1013.iteye.com/blog/2255037 jQuery.extend() 函数用于将一个或多个对象的内容合并到目标对象. 注意:1. 如果只为$.ex ...
- OC Copy基本使用(深拷贝和浅拷贝)
首先,什么是copy? Copy的字面意思是“复制”.“拷贝”,是一个产生副本的过程. 常见的复制有:文件复制,作用是利用一个源文件产生一个副本文件. 特点:1.修改源文件的内容,不会影响副本文件: ...
随机推荐
- Notepad++ 列操作
在网上找到一篇关于socket编程的文章,想把其中的代码直接拷贝下来运行测试,但是人家网站做的不够人性化,每行的开头都有行号,直接拷贝就要一行行的删除,甚是麻烦,想到linux下的vi编辑器可以完成列 ...
- APP中https证书有效性验证引发安全问题(例Fiddler可抓https包)
原文: https://blog.csdn.net/woddle/article/details/71175140 在实际项目代码审计中发现,目前很多手机银行虽然使用了https通信方式,但是只是简单 ...
- win server 2008 R2 支持
安装Microsoft Visual C++ 2010 可再发行组件包 (x64) vcredist_x64.exe 安装Microsoft .NET Framework 4 dotNetFx40_F ...
- AAA及Radius
一.AAA(Authentication.Authorization.Accounting) 验证.授权和记费 验证 Authentication :验证用户身份 授权 Authorization : ...
- IDEA远程调试
问题: 通常在java打成可运行的Jar项目时,运行jar时调试很不方便,特别是要在linux上面执行jar包的情况.此时需要将这个项目打成Jar包(如果是maven项目,直接使用pa ...
- 第9章 应用层(1)_域名系统DNS
1. 域名系统DNS 1.1 主机名和域名的关系 (1)完全限定域名(Fully Qualified Domain Name, FQDN) = 主机名 + 域名 ①一个域名下可以有多个服务器/主机(如 ...
- scala语法在spark withScope上的应用
withSpout在spark中是用来做DAG可视化的,它在代码里的用法如下(以map为例,spark 2.0.0版本) def map[U: ClassTag](f: T => U): RDD ...
- boost json序列化
json序列化 #ifndef FND_JSON_OBJECT_H #define FND_JSON_OBJECT_H #include <sstream> #include <bo ...
- android:clipChildren属性,子布局超出父布局;
是否允许子View超出父View的范围,Boolean型true .false ,默认true不允许: android:clipChildren="true":如下 android ...
- 请求(Request)的参数(Param)里包含特殊字符(#等)的正确处理方式
当调用restful接口,并且url中有参数传过去时,比如http://test.com?param=woshi#miaoyinga. 后台在使用@RequestParam("param&q ...