美文网首页
“深拷贝”和“浅拷贝”的本质是内存地址是否相同

“深拷贝”和“浅拷贝”的本质是内存地址是否相同

作者: 东方奇迹 | 来源:发表于2019-07-28 22:16 被阅读0次

1、拷贝的目的:产生一个副本对象,跟源对象互不影响(修改了源对象不会影响副本对象;修改了副本对象不会影响源对象)

2、iOS中提供了两个拷贝方法

(1)copy:不可变拷贝,产生不可变副本;
(2)mutableCopy:可变拷贝,产生可变副本;

3、“深拷贝”和“浅拷贝”

1.浅拷贝就是拷贝后,并没有进行真正的复制,而是复制的对象和原对象都指向同一个内存地址
2.深拷贝是真正的复制了一份,复制的对象指向了新的内存地址


1424422-53846bd9d1adfa32.png

浅拷贝好比你的影子,你死了,影子也没了;深拷贝好比克隆人,你死了,它还在。(浅拷贝:只拷贝指针,不拷贝对象。深拷贝:只拷贝对象,不拷贝指针。只有不可变类型进行不可变拷贝才是浅拷贝,其余都是深拷贝)

一、非容器不可变对象:NSString

1.对于非容器不可变对象的copy为浅拷贝,mutableCopy为深拷贝
2.浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象
3.深拷贝返回新的内存地址,返回对象为可变对象

二、非容器可变对象: NSMutableString

1.对于非容器可变对象的copy为深拷贝,mutableCopy为深拷贝
2.copy返回新的内存地址,返回对象为可变对象
3.mutableCopy返回新的内存地址,返回对象为可变对象

三、容器类不可变对象: NSArray

1.对于容器类不可变对象的copy为浅拷贝,mutableCopy为深拷贝
2.浅拷贝获得的对象地址和原对象地址一致, 返回的对象为不可变对象
3.深拷贝返回新的内存地址,返回对象为可变对象,但容器内的元素仍然是浅拷贝

四、容器类可变对象: NSMutableArray

1.对于容器类可变对象的copy为深拷贝,mutableCopy为深拷贝
2.copy返回新的内存地址,返回的对象为不可变对象,但容器内的元素仍然是浅拷贝
3.mutableCopy返回新的内存地址,返回对象为可变对象,但容器内的元素仍然是浅拷贝

五、用户自定义了一个对象,如何实现拷贝(可变和不可变拷贝)

只有遵循<NSCopying>才支持copy,只有遵循<NSMutableCopying>才支持mutableCopy。如果没有遵循,拷贝时会直接Crash。

相关文章

  • 深拷贝与浅拷贝

    概述 浅拷贝:指针拷贝深拷贝:内容拷贝具体如图1所示 本质 深拷贝和浅拷贝的本质是新的对象与原来的对象指针是否相同...

  • iOS的深浅拷贝

    浅拷贝:指针拷贝,引用拷贝,指向同一内存地址深拷贝:内容拷贝,指向不同内存地址,但内容相同 1、copy和muta...

  • iOS 关于容器类的浅、深拷贝探究

    引子 浅拷贝:指针拷贝,引用拷贝,指向同一内存地址 深拷贝:内容拷贝,指向不同内存地址,但是内容相同 容器类拷贝的...

  • “深拷贝”和“浅拷贝”的本质是内存地址是否相同

    1、拷贝的目的:产生一个副本对象,跟源对象互不影响(修改了源对象不会影响副本对象;修改了副本对象不会影响源对象) ...

  • Python的浅拷贝与深拷贝

    深拷贝和浅拷贝: 共同的点:都是对象的拷贝,都会生成一个看起来相同的对象; 本质区别:是拷贝出来的对象的地址是否和...

  • iOS入门小知识-拷贝

    深拷贝和浅拷贝 浅拷贝:只拷贝对象的地址,所拷贝出来的对象指针所指向的地址仍然是被拷贝对象的内存地址 深拷贝:真正...

  • iOS 深浅拷贝

    深拷贝和浅拷贝的本质区别是地址是否相同。 浅拷贝并没有进行真正的复制,而是复制的对象和原对象都指向同一个地址; 深...

  • 深浅拷贝,面向对象,Symbol,Set,Map

    一:浅拷贝与深拷贝对象的浅拷贝:浅拷贝是对象共用的一个内存地址,对象的变化相互影响。对象的深拷贝:简单理解深拷贝是...

  • 深拷贝、浅拷贝

    深拷贝、浅拷贝 浅拷贝 对象指针的复制,最终都是指向同一个内存地址 深拷贝 对象自身的拷贝,产生一个新的内存地址,...

  • 14-Python之路-进阶-拷贝

    浅拷贝 浅拷贝是对于一个对象的顶层拷贝,相当于快捷方式,两个对象的内存地址同时 浅拷贝:语法 深拷贝 深拷贝是对于...

网友评论

      本文标题:“深拷贝”和“浅拷贝”的本质是内存地址是否相同

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