对象拷贝主要由两种方式:copy和mutableCopy。浅拷贝是指直接将指针指向原有的地址,从而达到复制的目的。深拷贝是指重新生成一个对象,将原有对象的内容复制到新的对象中。copy 返回的是一个不可变的对象,mutableCpoy返回的是一个可变的对象,但是由于OC的弱语法特性,即使如下使用编译器也不会报错。但是再运行时,arrayCopy会找不到具体的方法,报错。

NSMutableArray *arrayCopy=[muArray copy];

copy当所引用的对象是可变的时,则是深拷贝,如果是不可变对象则是浅拷贝。mutableCopy 不管对象是否为可变,都是深拷贝。

int main(int argc, const char * argv[])
{ NSMutableArray *muArray=[[NSMutableArray alloc] init]; //定义一个ClassA类,仅作测试用无实际意义
ClassA *a=[[ClassA alloc] init];
[muArray addObject:a]; NSMutableArray *arrayCopy=[muArray copy];//如果调用add object:则会在运行时报错,但是编译时并不会报错(弱语法)
NSMutableArray *arrayMutableCopy=[muArray mutableCopy]; NSLog(@"%p---%p----%p",arrayCopy,muArray,arrayMutableCopy); [a release];
[muArray release];
[arrayMutableCopy release];
[arrayCopy release];
return 0;
}

打印出来的结果是

2015-01-23 12:06:58.342 Test[3375:303] 0x100100d40---0x1001023b0----0x100105020

可以看出地址都不相同。

int main(int argc, const char * argv[])
{
NSArray *array=@[@1,@2,@3]; NSArray *arrayCopy=[array copy];
NSMutableArray *arrayMutableCopy=[array mutableCopy]; NSLog(@"%p---%p----%p----%ld",arrayCopy,array,arrayMutableCopy,[arrayCopy retainCount]); [arrayMutableCopy release];
[arrayCopy release];
return 0;
}

打印出来的结果是

2015-01-23 12:08:40.091 Test[3388:303] 0x100204ae0---0x100204ae0----0x1002054e0----2

可以看出使用copy出来的对象地址与原地址一样,也就是其实是同一个对象。且引用计数器也是2。

与所有容器类一样,NSArray中存放的依旧是指针。并不是对象本身,其实数组中每个元素都是对象的地址。当我们使用浅拷贝时我们大部分人都能注意到对象共有的问题。如:

int main(int argc, const char * argv[])
{ NSMutableArray *muArray=[[NSMutableArray alloc] init]; //定义一个ClassA类,仅作测试用无实际意义
ClassA *a=[[ClassA alloc] init];
a.val=1;//原数组中,第一个对象的val是1
[muArray addObject:a]; NSArray *arrayCopy=[muArray copy];
ClassA *b=arrayCopy[0];
b.val=2;//将浅拷贝的数组,第一个元素的val变为2 NSLog(@"%ld",[muArray[0] val]); [a release];
[muArray release];
[arrayCopy release];
return 0;
}

打印结果为

2015-01-23 12:21:32.972 Test[3443:303] 2

即使是深拷贝,依然对原来的数组造成了影响。

因为存放的都是地址,所以深拷贝时,将全部的地址拷了过去,但是还是指向同一个对象。

copy和mutableCopy的深、浅拷贝的更多相关文章

  1. copy和mutableCopy都是浅拷贝!!!------你被骗了很多年

    所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!! (ps:什么是容器?比如NSArray,NSMutableArray,NSDictionary,NSMutableDiction ...

  2. iOS 浅谈:深.浅拷贝与copy.strong

    深.浅拷贝 copy mutableCopy NSString NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSString *copyStri ...

  3. 【转】iOS 浅谈:深.浅拷贝与copy.strong

    深.浅拷贝 copy mutableCopy NSString 1 2 3 4 5 6 NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSStri ...

  4. 【转】copy 和 mutablecopy (深拷贝和浅拷贝)

    阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属 ...

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

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

  6. Copy 与MutableCopy的区别

    NSString *string = @"origion"; NSString *stringCopy = [string copy]; NSMutableString *stri ...

  7. 对copy、mutableCopy理解

    Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copy 和 mutableCopy 的区别以及相关用法. Objective - C 中可变对象和不可对象经 ...

  8. 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解

    最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...

  9. iOS copy 和 mutableCopy 学习

    (参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy  有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底 ...

随机推荐

  1. Unix环境高级编程

    1.  windows下编辑的程序怎么上传到linux下执行? //Service vsftpd status查看linux ftp服务是否开启: Linuxi ip:192.168.40.128 打 ...

  2. 理解I/O Completion Port

    欢迎阅读此篇IOCP教程.我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼.OK,但我不能保证你明白IOCP的一切,但我会尽我 ...

  3. Parallels Desktop 7用bootcamp安装win7 后如何激活WIN7

    在parallels的选项中,在硬件选项卡的引导标记中添加:kernel.waet.enable=0 ,重新启动win7即可激活.

  4. Unity 中关于 BuildSetting 中 “Optimize Mesh Data” 选项的“坑”

    Unity 在底层默认希望为你做尽可能多的优化,降低使用门槛,比如 BuildSetting 中的 Optimize Mesh Data 选项就是一个典型的例子. 这个选项到底有什么用呢?文档描述为: ...

  5. 安卓开发无法识别手机原因之一:手机SDK比工程要求的最小SDK低

      创建工程时,设置限制的最小SDK:   如果你手机的内核版本比你工程的设置的最小SDK低,则不显示   来自为知笔记(Wiz)

  6. Axure RP 8.0 中继器初体验

    为了解决增删等复杂交互的问题,中继器是个不错的选择. 拖拽出一个默认的中继器 中继器的数据集感觉就像是数据库一样,在右边检视窗口中可以看到中继器的默认数据集,可以理解成一张二维表.默认有1列,现成的3 ...

  7. Educational Codeforces Round 3

    A. USB Flash Drives 水题,排序即可 ]; int main() { int n,m; scanf("%d%d",&n,&m); ;i<n; ...

  8. 校友信息管理&SNS互动平台之前言、目录及说明

    开篇 刚刚主持完成了某985大学(为了保密和避免广告嫌疑,此处不指出具体大学的名称)的“校友信息管理系统&SNS互动平台”大型项目,本着总结经验,技术共享的原则,本系列文章将全面介绍该项目的需 ...

  9. linux中mysql完整卸载命令操作

    yum方式安装的mysql 1.yum remove mysql mysql-server mysql-libs compat-mysql51 2.rm -rf /var/lib/mysql3.rm ...

  10. .jar是什么文件?(转载)

    JAR(Java ARchive,Java 归档)是一种与平台无关的文件格式,可将多个文件合成一个文件.用户可将多个 Java applet 及其所需组件(.class 文件.图像和声音)绑定到 JA ...