shallow copy & deep copy
1、深复制与浅复制的概念
= operator to perform a copy on these objects results in a duplication of the object reference. In contrast to simple objects like CFString and CFData, the “CreateCopy” functions provided for compound objects such as CFArray and CFSet actually perform a shallow copy. In the case of these objects, a shallow copy means that a new collection object is created, but the contents of the original collection are not duplicated—only the object references are copied to the new container.
我对“资源库”文件夹进行拷贝,浅拷贝的意思就是,我对“资源库”文件创建了一个副本(创建时是空的),并且把其中的文件复制一份放到“资源库 副本”中,然后把其中的文件夹放到“资源库 副本”中,但是这些文件夹里面并没有内容,(我们可以通过这个文件夹找到其中的内容,准确的说是将文件夹的替身放到“资源库 副本”中-复制指针或者叫文件夹对象),这时候改变“资源库”下面文件夹中的内容会影响到“资源库 副本”。如果是深拷贝,就相当于,我创建了一个“资源库”文件夹,然后将其中的内容,包括文件、文件夹以及文件夹下面的所有东西,完完整整的拷贝过去,放在另外一个地方。
#pragma mark 演示字符串的拷贝(浅拷贝)
// 只有一种情况是浅拷贝:不可变对象调用copy方法时
// 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。
void stringCopy() {
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
NSLog(@"%zi", [string retainCount]);
// copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身
// 源对象计数器会+1
// 在浅拷贝情况下,copy其实就相当于retain
NSString *str = [string copy];
NSLog(@"%zi - %p -%p", [string retainCount],string, str);
[str release];
[string release];
}
#pragma mark 演示字符串的拷贝(深拷贝)
// 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
void stringMutableCopy() {
// string:1
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10];
// 产生了一个新的对象,计数器为1。源对象的计数器不变。
// str:1
// string:1
NSMutableString *str = [string mutableCopy];
//NSLog(@"str:%zi", [str retainCount]);
//NSLog(@"string:%zi", [string retainCount]);
// str和string不是相同对象
// NSLog(@"%i", str == string);
[str appendString:@" abcd"];
NSLog(@"string:%@", string);
NSLog(@"str:%@", str);
// str:0
[str release];
// string:0
[string release];
}
NSMutableString *str1 = [NSMutableString stringWithFormat:@"age = %d", 10];
NSMutableString *str2 = [NSMutableString stringWithFormat:@"age = %d", 10];
NSMutableString *str3 = [NSMutableString stringWithFormat:@"age = %d", 10];
NSArray *array1 = @[str1, str2, str3];
NSArray *array2 = [array1 copy];// 浅复制,仅仅是拷贝array1指向的内存地址存放的内容,此处是取出指针,放到array2中,所以array与array2存放的内容一样(都是指向str1,str2,str3的地址)
NSLog(@"%p - %p - %p",array1[0], array1[1], array1[2]);
NSLog(@"%p - %p - %p",array2[0], array2[1], array2[2]);
个人感觉,理解深复制和浅复制的关键在于抓住复制的主要目的,即产生一个副本对象,在改变源对象或者副本对象时,不会影响另外一个,然后浅复制就是浅层次的复制,只复制表面的东西,深复制就是更深层次的复制,只要与之相关的全部复制过去。
关键是理解清楚指针、指向指针的指针、copy的真正意义,之后再回头看深复制与浅复制,so easy。
shallow copy & deep copy的更多相关文章
- Numpy copy & deep copy
1. '='的赋值方式会带有关联性 >>> import numpy as np >>> a = np.arange(4) >>> b = a & ...
- Numpy的学习6-深浅赋值(copy&deep copy)
# = 的赋值方式会带有关联性 import numpy as np a = np.arange(4) # array([0, 1, 2, 3]) b = a c = a d = b # 改变a的第一 ...
- Shallow Copy & Deep Copy in Python list
今天在写一个小程序的时候用到了2维数组, 顺手就写成了[[0.0]*length]*length, 结果为了这个小错,调试了半个多小时, 其实之前对与浅复制和深复制已经做过学习和总结, 但真正编程用到 ...
- Shallow copy and Deep copy
Shallow copy and Deep copy 第一部分: 一.来自wikipidia的解释: Shallow copy One method of copying an object is t ...
- shallow copy 和 deep copy 的示例
本文属原创,转载请注明出处:http://www.cnblogs.com/robinjava77/p/5481874.html (Robin) Student package base; impo ...
- python deep copy and shallow copy
Python中对于对象的赋值都是引用,而不是拷贝对象(Assignment statements in Python do not copy objects, they create bindings ...
- JavaScript 深拷贝(deep copy)和浅拷贝(shallow copy)
参考: [进阶4-1期]详细解析赋值.浅拷贝和深拷贝的区别 How to differentiate between deep and shallow copies in JavaScript 在编程 ...
- Summary: Deep Copy vs. Shallow Copy vs. Lazy Copy
Object copy An object copy is an action in computing where a data object has its attributes copied t ...
- python中的shallow copy 与 deep copy
今天在写代码的时候遇到一个奇葩的问题,问题描述如下: 代码中声明了一个list,将list作为参数传入了function1()中,在function1()中对list进行了del()即删除了一个元素. ...
随机推荐
- 初识iOS9 iPad新特性SlideView和SplitView的适配
苹果刚发布了iOS9,在iPad上新增了两个新的特性SlideView和SplitView,前者可以在不关闭当前激活APP的情况下调出来另外个APP以30%比例显示进行操作使用,后者允许同时运行两个A ...
- (转)对DotNet分布式应用搭建的考虑
设计前的考虑和准备工作 1 对业务需求的理解重要性远远胜于对技术架构的理解 2 架构包含技术架构和业务架构 3 没有万能和通用的架构,只有符合自身业务需求的架构 4 架构本身的复杂性要截至在架构设计阶 ...
- WP开发笔记——WP APP添加页面跳转动画
微软的toolkit团队为我们为我们提供了这样一套组件,叫做TransitionServices服务. 简单说一下它具备的效果: turnstile(轴旋转效果): turnstile feather ...
- Linux时间相关函数
相关文件: /etc/localtime 本地时间二级制文件 /etc/sysconfig/clock 时区配置文件 /usr/share/zoneinfo 存储各个时区的二进制文件 时间修改方 ...
- document.write() 和 document.writeln() 区别
写javascript页面时,看到这两个函数,第一感觉应该是一个换行,一个不换行, 但是实际使用时是一样的(writeln()函数在浏览器页面会多一个空格而不是换行). 简单搜索查阅了下: 查看源 d ...
- WInform启动另一个项目传值
背景:从A项目中登陆后,跳转到B项目的某个页面(B不再登陆). A项目启动进程: public Form1() { InitializeComponent(); } #region 调用进程 [Dll ...
- Assembly(程序集) 反射和缓存
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...
- laravel--has方法--查看关联关系
has()方法可以用来查询是否有关联关系的一个东西,一般其他的has方法 就是判断这个里面有没有值 $packageOrders = Company::has('packages')->get( ...
- eclipse增加浏览器chrome
1.安装完了google chrome游览器后,如何让eclipse直接用chrome打开jsp 2.添加到eclipse环境中即可, Window(菜单) -- preferences 增加成功后, ...
- CentOS 6.3 配置 yum
ContOS 配置yum:1.cd /etc/yum.repos.d2.创建个任意目录,将所有文件移动到创建的目录中,除了CentOS-Media.repo3.编辑CentOS-Media.repov ...