copy和mutableCopy的深、浅拷贝
对象拷贝主要由两种方式: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的深、浅拷贝的更多相关文章
- copy和mutableCopy都是浅拷贝!!!------你被骗了很多年
所有系统容器类的copy或mutableCopy方法,都是浅拷贝!!! (ps:什么是容器?比如NSArray,NSMutableArray,NSDictionary,NSMutableDiction ...
- iOS 浅谈:深.浅拷贝与copy.strong
深.浅拷贝 copy mutableCopy NSString NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSString *copyStri ...
- 【转】iOS 浅谈:深.浅拷贝与copy.strong
深.浅拷贝 copy mutableCopy NSString 1 2 3 4 5 6 NSString *string = @"汉斯哈哈哈"; // 没有产生新对象 NSStri ...
- 【转】copy 和 mutablecopy (深拷贝和浅拷贝)
阅读本文之前首先了解copy与retain的区别,如果有不正确的地方望大家多多指教: copy与retain的区别: copy是创建一个新对象,retain是创建一个指针,引用对象计数加1.Copy属 ...
- iOS开发之Copy & MutableCopy及深复制 & 浅复制
1.使用copy或mutableCopy方法可以创建一个对象的副本. copy: (1)需要实现NSCoppying协议 (2)创建的是不可变副本(如NSString.NSArray.NSDictio ...
- Copy 与MutableCopy的区别
NSString *string = @"origion"; NSString *stringCopy = [string copy]; NSMutableString *stri ...
- 对copy、mutableCopy理解
Objective - C 中有很多在日常项目中经常用到的常用代码,在这里着重的讲一下关于copy 和 mutableCopy 的区别以及相关用法. Objective - C 中可变对象和不可对象经 ...
- 关于:1.指针与对象;2.深浅拷贝(复制);3.可变与不可变对象;4.copy与mutableCopy的一些理解
最近对深浅拷贝(复制)做了一些研究,在此将自己的理解写下来,希望对大家有所帮助.本人尚处在摸索阶段,希望各位予以指正. 本文包括如下方向的探索: 1.指针与对象: 2.深/浅拷贝(复制): 3.可变/ ...
- iOS copy 和 mutableCopy 学习
(参考 iOS 52个技巧学习心得笔记 第二章 对象 , 消息, 运行期)的对象部分 关于Copy 有个经典问题”大部分的时候NSString的属性都是copy,那copy与strong的情况下到底 ...
随机推荐
- python 中 time 模块 格式化 format
%y 两位数的年份表示(00-99)%Y 四位数的年份表示(000-9999)%m 月份(01-12)%d 月内中的一天(0-31)%H 24小时制小时数(0-23)%I 12小时制小时数(01-12 ...
- 【好文转载c++】 sizeof 使用的经典总结
为了在人面前畅快的吹牛逼,你必须学会背后努力 -----张小二. 写在转载之前: sizeof到底是多少?本来我没有关注,只是有次室友问了我几个sizeof的问题,我被问住了,他当时问我了sizeo ...
- JavaScript高级程序设计32.pdf
样式 在HTML中定义样式的方式有3种:通过<link/>元素包含外部样式表文件.使用<style/>元素定义嵌入式样式,以及使用style特性定义针对特定元素的样式,“DOM ...
- .net常見面試題(二)
一.选择题 1. 下面叙述正确的是___C___. A.算法的执行效率与数据的存储结构无关 B.算法的空间复杂度是指算法程序中指令(或语句)的条数 C.算法的有穷性是指算法必须能在执行有限个步骤之后终 ...
- 关于list 添加数据到指定下标
1 2 3 4 5 6 7 8 9 10 11 12 protected <T> List<BusinessItemData> itemMap2ItemList(Map< ...
- 用chrome按F12抓包 页面跳转POST一瞬间就闪没了
- GetTickCount() 函数的作用和用法
今天项目中60秒倒计时模块需要用到GetTickCount(),这个函数,在此做下整理和总结. 1.定义 For Release configurations, this function retur ...
- WTL 自定义 Button类-自绘
WTL 自绘Button类,支持按钮三种形态,正常模式,hover模式,鼠标按下模式,支持png图片.使用方法很简单: MyButton* pButton = new MyButton; pBut ...
- CGI初识
---恢复内容开始--- 转自http://www.moon-soft.com/program/bbs/readelite887957.htm 用 C/C++ 写 CGI 程序 小传(zhcharle ...
- JavaScript 应用开发 #4:切换任务的完成状态
在勾选了任务项目左边的对号(复选框)以后,会将任务的状态标记为已完成,取消勾选的话,又会把任务的状态标记为未完成.所以, 我们需要一个可以切换任务完成状态的方法.在任务模型里面,表示任务状态的属性是 ...