美文网首页
深浅复制

深浅复制

作者: 不辣先生 | 来源:发表于2020-01-07 17:58 被阅读0次

为了理解这种做法,首先要知道,两种情况:

  1. 对非集合类对象的 copy 与 mutableCopy 操作;

  2. 对集合类对象的 copy 与 mutableCopy 操作。

  3. 对非集合类对象的copy操作:

在非集合类对象中:对 immutable 对象进行 copy 操作,是指针复制,mutableCopy 操作时内容复制;对 mutable 对象进行 copy 和 mutableCopy 都是内容复制。用代码简单表示如下:

  • [immutableObject copy] // 浅复制
  • [immutableObject mutableCopy] //深复制
  • [mutableObject copy] //深复制
  • [mutableObject mutableCopy] //深复制

比如以下代码:

NSMutableString *string = [NSMutableString stringWithString:@"origin"];//copy
NSString *stringCopy = [string copy];

查看内存,会发现 string、stringCopy 内存地址都不一样,说明此时都是做内容拷贝、深拷贝。即使你进行如下操作:

[string appendString:@"origion!"]

stringCopy 的值也不会因此改变,但是如果不使用 copy,stringCopy 的值就会被改变。 集合类对象以此类推。 所以,

用 @property 声明 NSString、NSArray、NSDictionary 经常使用 copy 关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间可能进行赋值操作,为确保对象中的字符串值不会无意间变动,应该在设置新属性值时拷贝一份。

2、集合类对象的copy与mutableCopy

集合类对象是指 NSArray、NSDictionary、NSSet ... 之类的对象。下面先看集合类immutable对象使用 copy 和 mutableCopy 的一个例子:

NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"]];
NSArray *copyArray = [array copy];
NSMutableArray *mCopyArray = [array mutableCopy];

查看内容,可以看到 copyArray 和 array 的地址是一样的,而 mCopyArray 和 array 的地址是不同的。说明 copy 操作进行了指针拷贝,mutableCopy 进行了内容拷贝。但需要强调的是:此处的内容拷贝,仅仅是拷贝 array 这个对象,array 集合内部的元素仍然是指针拷贝。这和上面的非集合 immutable 对象的拷贝还是挺相似的,那么mutable对象的拷贝会不会类似呢?我们继续往下,看 mutable 对象拷贝的例子:

NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArray = [array copy];
NSMutableArray *mCopyArray = [array mutableCopy];

查看内存,如我们所料,copyArray、mCopyArray和 array 的内存地址都不一样,说明 copyArray、mCopyArray 都对 array 进行了内容拷贝。同样,我们可以得出结论:

在集合类对象中,对 immutable 对象进行 copy,是指针复制, mutableCopy 是内容复制;对 mutable 对象进行 copy 和 mutableCopy 都是内容复制。但是:集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制。用代码简单表示如下:

[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //单层深复制
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制

这个代码结论和非集合类的非常相似。
本文转载, 招聘一个靠谱的iOS》面试题参考答案

相关文章

  • 深浅复制

    深浅复制和属性为copy,strong值的变化问题 浅复制:只复制指向对象的指针,而不复制引用对象本身。对于浅复制...

  • 深浅复制

    Python中的对象之间赋值时是按引用传递的,如果需要拷贝对象,需要使用标准库中的copy模块。 copy.cop...

  • 深浅复制

    参考链接 iOS 集合的深复制与浅复制

  • 深浅复制

    为了理解这种做法,首先要知道,两种情况: 对非集合类对象的 copy 与 mutableCopy 操作; 对集合类...

  • iOS中的深浅复制

    iOS中的深浅复制

  • 深拷贝和浅拷贝

    深复制和浅复制 1、概述 对象拷贝有两种方式:浅复制和深复制。 浅复制:拷贝指针 深复制:拷贝整个对象 2、深浅复...

  • 深拷贝和浅拷贝

    深复制(deepcopy)和浅复制(shadow copy) 深浅复制的区别 在面向对象语言中,一般来说浅复制是指...

  • 关于深浅拷贝的那些事

    前言 所谓深浅拷贝,其实都是进行复制,主要区别在于复制出来的新对象和原来的对象时候会相互影响。深浅拷贝的区分:B ...

  • JS中的深浅复制

    什么是深浅复制? 深复制:把要复制的对象的所引用的全部对象都复制一遍。开辟新空间。 浅复制:仅仅复制对象的引用,而...

  • Java如何复制对象(深浅)

    假如说你想复制一个简单变量。很简单: 不仅仅是int类型,其它七种原始数据类型(boolean,char,byte...

网友评论

      本文标题:深浅复制

      本文链接:https://www.haomeiwen.com/subject/kjkdactx.html