美文网首页
浅拷贝,深拷贝以及全拷贝

浅拷贝,深拷贝以及全拷贝

作者: 叮咚强 | 来源:发表于2018-04-23 19:42 被阅读0次

iOS里面深浅拷贝问题已经是老生常谈的问题了,而且也几乎是面试必问的提。我这篇文章说的也不是什么高深技术点,只是个小细节的东西,平时能注意到就行

系统的那些对象如:NSString,NSDictionary,NSArray以及他们的子类等,都可以直接使用copy和mutableCopy,系统已经帮忙给他们实现了,NSCopying,NSMutableCopying协议,但是我们自定的对象如果想要使用copy或mutableCopy,必须手动实现对应的NSCopying或NSMutableCopying协议,并且实现对应的方法:

- (id)copyWithZone:(nullableNSZone*)zone;   和

- (id)mutableCopyWithZone:(nullableNSZone*)zone

浅拷贝:指针复制,复制出来的指针指向的还是同一块区域。通过其中一个指针对内容进行修改,会影响另一个指针,因为他俩其实指向同一块区域。

怎样会发生浅拷贝?

就用系统的NSString,NSDictionary,NSArray来说,这些不可变对象,注意重点,不可变对象,他们直接调用copy(不是mutableCopy)则发生的浅拷贝;

直接上图上代码:

这里发生的浅拷贝,前后两个数组打印的东西一样,当然这不能证明两者指向的区域一样,因为哪怕是深拷贝,这里的打印结果两者也是一样的。由于是不可变数组,没法用移除数组元素来证明,但是可以肯定的是,如果此时其中一个数组移除(假设可以移除)Student对象,另一个数组肯定也同时移除了。有同学可能就要说了,可不可以通过改变复制出来的数组里的Student对象的属性,来证明是浅拷贝。这种肯定是不行的,因为就算是深拷贝,这里的Student对象也只有一份,这也是这篇文章最重要的一点,关于全拷贝。请听下文分解。

深拷贝:内容复制,其实直接说内容复制是不准确的,会让人误解,以这里的数组为例,会让人以为数组里头的对象也会被复制。

怎样会发生深拷贝?

如果是不可变对象如NSString,NSDictionary,NSArray来说,只有调用mutableCopy才会发生深拷贝,如果是他们的可变子类,则调用copy或mutableCopy都会发生深拷贝;

上图:

不可变对象调用mutableCopy发生深拷贝

可变对象调用copy发生深拷贝,可变对象调用mutableCopy那也毫无疑问是深拷贝,可自证

这些都是深拷贝,结果通过图片一目了然;

接下来就是重点了,为什么说“深拷贝是内容复制”这种说法不准确?看图:

可以看到,即使是深拷贝,数组里头的内容仍然只有一份,修改了一个Student对象的name,所有的Student对象都发生了改变。

那怎样才能实现内容复制呢,即我说的全拷贝。系统提供了方法,这里以数组为例,系统方法:

- (instancetype)initWithArray:(NSArray *)array copyItems:(BOOL)flag

系统提供了这一类方法,后面带一个是否进行内容拷贝的标识,YES则表示数组里头的内容也被复制。对应的字典也有类似方法。但是要注意,这个时候如果集合里头的对象是自定义对象,比如这里的Student对象,那必须让Student实现NSCopying协议,并实现-(id)copyWithZone:(NSZone*)zone方法。否则会崩。这种拷贝我给取名为全拷贝!

相关文章

  • 浅拷贝,深拷贝以及全拷贝

    iOS里面深浅拷贝问题已经是老生常谈的问题了,而且也几乎是面试必问的提。我这篇文章说的也不是什么高深技术点,只是个...

  • js浅拷贝、深拷贝

    前言 本文主要简单讲一下什么是浅拷贝、什么是深拷贝、深拷贝与浅拷贝的区别,以及怎么进行深拷贝和怎么进行浅拷贝。 一...

  • iOS深拷贝(MutableCopy)与浅拷贝(Copy)的区别

    深拷贝和浅拷贝的概念 iOS中有深拷贝和浅拷贝的概念,那么何为深拷贝何为浅拷贝呢?浅拷贝:浅拷贝并不拷贝对象本身,...

  • iOS - copy 与 mutableCopy

    一说到拷贝,就不得不提浅拷贝和深拷贝。 何谓浅拷贝?何谓深拷贝? 往简单的说: 浅拷贝:拷贝地址。 深拷贝:拷贝内...

  • iOS面试题-第二页

    11.深拷贝和浅拷贝的理解. 深拷贝;拷贝的内容. 浅拷贝:拷贝的指针. 深拷贝如: NSMutableDicti...

  • iOS--拷贝相关题

    1、什么是深拷贝什么是浅拷贝?浅拷贝和深拷贝的区别 * 浅拷贝(shallow copy):指针拷贝,对于被拷贝对...

  • js浅拷贝深拷贝

    js浅拷贝,深拷贝的简单实现 基础数据 浅拷贝 深拷贝

  • JS中的深拷贝与浅拷贝

    知乎:js中的深拷贝和浅拷贝? 掘金: js 深拷贝 vs 浅拷贝 前言 首先深拷贝与浅拷贝只针对 Object,...

  • 深拷贝和浅拷贝

    1.深拷贝:地址的拷贝 2.浅拷贝:是值得拷贝 深拷贝和浅拷贝的区别 A拷贝B B变A变是浅拷贝 A拷贝B B变A...

  • 2018-10-10day9函数基础

    1.浅拷贝、深拷贝 copy.copy(对象):浅拷贝copy.deepcopy(对象):深拷贝""" """拷贝...

网友评论

      本文标题:浅拷贝,深拷贝以及全拷贝

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