美文网首页
深浅复制

深浅复制

作者: 一个人在路上走下去 | 来源:发表于2018-08-06 22:06 被阅读172次

深浅复制和属性为copy,strong值的变化问题

浅复制:只复制指向对象的指针,而不复制引用对象本身。对于浅复制来说,A和A_copy指向的是同一个内存资源,复制的只不个是一个指针,对象本身资源还是只有一份,那如果我们对A_copy执行了修改操作,那么发现A引用的对象同样被修改了。深复制就好理解了,内存中存在了两份独立对象本身。

在Objective-C中并不是所有的对象都支持Copy,MutableCopy,遵守NSCopying协议的类才可以发送Copy消息,遵守NSMutableCopying协议的类才可以发送MutableCopy消息。

[immutableObject copy] // 浅拷贝
[immutableObject mutableCopy] //深拷贝
[mutableObject copy] //深拷贝
[mutableObject mutableCopy] //深拷贝

代码示例如下:

对于不可变对象而言,copy便是浅拷贝,而mutableCopy是深拷贝 对于可变对象而言,copy和mutableCopy都是深拷贝

对于不可变对象而言,copy便是浅拷贝,而mutableCopy是深拷贝。
对于可变对象而言,copy和mutableCopy都是深拷贝。但是copy出来的对象是不可变的,使用addObject: 方法会报错,而mutableCopy则是可变对象。

为什么要有深浅拷贝的区别

深浅拷贝的本质区别是对象或者对象属性的内存地址是否一样,一样则为浅拷贝,不一样则为深拷贝。

在C++中,当出现类的等号赋值时,会调用拷贝函数。在未定义显示拷贝构造函数的情况下,系统会调用默认的拷贝函数——即浅拷贝,它能够完成成员的一一复制。当数据成员中没有指针时,浅拷贝是可行的。

但当数据成员中有指针时,如果采用简单的浅拷贝,则两类中的两个指针将指向同一个地址,当对象快结束时,会调用两次析构函数,而导致指针悬挂现象。
所以,这时,必须采用深拷贝。

深拷贝与浅拷贝的区别就在于深拷贝会在堆内存中另外申请空间来储存数据,从而也就解决了指针悬挂的问题。简而言之,当数据成员中有指针时,必须要用深拷贝。

浅拷贝的优势是不重新开辟内存空间,深拷贝的优势是不互相干扰。

属性分析

属性设为copy,指定此属性的值不可更改,防止可变字符串更改自身的值的时候不会影响到对象属性(如NSString,NSArray,NSDictionary)的值。strong此属性的指会随着变化而变化。copy是内容拷贝,strong是指针拷贝。

相关文章

  • 深浅复制

    深浅复制和属性为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/dqhnvftx.html