美文网首页
浅拷贝和深拷贝

浅拷贝和深拷贝

作者: i爱吃土豆的猫 | 来源:发表于2021-04-13 23:22 被阅读0次

copy的特点:

修改源对象的属性和行为,不会影响副本对象
修改副本对象的属性和行为,不会影响源对象

浅拷贝只拷贝了地址, 深拷贝拷贝了地址和内容
浅拷贝好比你的影子,你死了,影子也没了;
深拷贝好比克隆人,你死了,它还在。

NSString *str1 = @"非容器不可变对象";  
NSString *str2 = [str1 copy];            得到的 NSMutableString  没有开辟内存空间, 只是复制了地址   
NSString *str3 = [str1 mutableCopy];    得到的  NSString

NSMutableString *str1 = [NSMutableString stringWithFormat:@"非容器可变对象"];
NSMutableString *str2 = [str1 copy];            NSString
NSMutableString *str3 = [str1 mutableCopy];      NSString

用copy修饰的 或者赋值的 变量肯定是不可变的。
用copy赋值,要看源对象是否是可变的,来决定只拷贝指针,还是也拷贝对象到另一块内存空间
对象之间mutableCopy赋值,肯定会拷贝整个对象内存到另一块内存中
对象之间赋值之后,再改变,遵循互不影响的原则

1)、当源对象是不可变类型的时候,使用copy操作,得到的还是不可变类型副本,并且副本内存地址(指针)和源对象的内存地址是一样的,可以认为源对象和副本对象是同一对象,并没有产生新对象,相当于是执行了一次retain操作,这样的copy操作,叫做浅拷贝,也有人叫指针拷贝;

2)、当源对象是可变类型的时候,使用copy操作得到的是不可变类型副本。类型不一样,内存地址也肯定不一样,即在内存中分配了新的地址空间,产生了新的对象。虽然内存地址不一样,但两者的内容是一样的,这样的copy操作,叫做深拷贝,也有人这叫做内容拷贝;

3)、当源对象是不可变类型,使用mutableCopy操作,得到的副本对象是可变类型。一个可变,一个不可变,类型不一样,内存地址也不一样,产生了新的对象,所以也是深拷贝;

4)、当源对象是可变类型,使用mutableCopy操作,得到的副本对象是可变类型。这个时候源对象和副本对象的内存地址是否一样?是否产生了新的对象?上面提到过,使用复制的目的是,改变源对象,副本对象的内容不跟着改变,根据这个原则,两个可变类型对象,要想一个改变不影响另外一个,只能是两个不同的对象,指向不同的内存地址。所以,当源对象是可变类型,使用mutableCopy操作,得到的副本对象是可变类型,这个副本是新的对象,也是深拷贝;

NSString *str2 = [str1 copy]; NSString 浅拷贝
NSMutableString *str2 = [str1 copy]; NSString 深拷贝

NSString *str3 = [str1 mutableCopy]; NSMutableString 深拷贝
NSMutableString *str3 = [str1 mutableCopy]; NSMutableString 深拷贝

copy: 对于可变对象为深拷贝,对于不可变对象为浅拷贝
mutableCopy:始终是深拷贝

相关文章

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

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

  • iOS面试题-第二页

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

  • iOS - copy 与 mutableCopy

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

  • JS中的深拷贝与浅拷贝

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

  • iOS--拷贝相关题

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

  • copy和mutableCopy的区别

    copy和mutableCopy的区别 深拷贝和浅拷贝的区别 在OC中对象的拷贝方式有两种:深拷贝和浅拷贝.浅拷贝...

  • 2018-10-10函数基础

    深拷贝和浅拷贝 深拷贝 copy.deepcopy(对象)浅拷贝 copy.copy(对象)深拷贝: 将对象对应的...

  • Objective-C中的浅拷贝和深拷贝

    Objective-C中的浅拷贝和深拷贝 Objective-C中的浅拷贝和深拷贝

  • JavaScript的深拷贝和浅拷贝

    原文 博客原文 大纲 前言1、对深拷贝和浅拷贝的初步认识2、深拷贝和浅拷贝的区别3、浅拷贝存在的缺陷4、深拷贝的实...

  • java中的深拷贝和浅拷贝

    简单记录一下java中的深拷贝和浅拷贝,深拷贝和浅拷贝只是针对对象而言的. 1 深拷贝代码 2 浅拷贝代码 3 测...

网友评论

      本文标题:浅拷贝和深拷贝

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