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

深拷贝和浅拷贝不同

作者: 曼谷第一开膛手 | 来源:发表于2018-04-28 16:43 被阅读27次

浅拷贝:指针(地址)拷贝,不会产生新对象
深拷贝:内容拷贝,会产生新对象

非容器类对象的深拷贝、浅拷贝

非容器类对象:NSString,NSNumber这些不能包含其他对象的叫做非容器类

NSString(不可变字符串)

NSString *string1 = @"helloworld";  
NSString *string2 = [string1 copy]; // 浅拷贝  
NSString *string3 = [string1 mutableCopy]; // 深拷贝  
浅拷贝类似retain,引用计数对象+1.创建一个指针;属性表示两个对象地址相同(建立一个指针,指针拷贝)
深拷贝是真正意义上的拷贝,是创建一个新对象。copy属性表示两个对象内容相同,新的对象retain为1,与原对象的引用计数无关,原对象没有改变。

总结: 因为都是不可变字符串,创建方式并不影响拷贝方式。所以可以得出结论,对于字符串这类非容器类对象,copy是浅拷贝,mutable是深拷贝。

NSMutableString(可变字符串)

// 如果是一个MutableString,那么无论是copy,mutableCopy,都会创建一个新对象。  
   NSMutableString *string1 = [NSMutableString stringWithString:@"helloworld"];  
   NSString *string2 = [string1 copy]; // 深拷贝  
   NSString *string3 = [string1 mutableCopy]; // 深拷贝  

总结:对于MutableString,右侧无论是copy还是mutableCopy,都会创建一个新对象,都是属于深拷贝。

可变字符串拷贝后 是否是 可变字符串呢

// 如果是一个MutableString,那么无论是copy,mutableCopy,都会创建一个新对象。  
   NSMutableString *string1 = [NSMutableString stringWithString:@"helloworld"];  
   NSString *string2 = [string1 copy]; // 深拷贝  
   NSString *string3 = [string1 mutableCopy]; // 深拷贝  
   NSMutableString *string4 = [string1 copy]; // 深拷贝  
   NSMutableString *string5 = [string1 mutableCopy]; // 深拷贝  
// 增加以下代码  
   [string4 appendString:@"MMMMMM"];  
   [string5 appendString:@"11111"]; 

运行代码后,会在[string4 apendString:@“MMMMM”];这一行出现崩溃
总结:1. 对于可变对象的复制,都是深拷贝;
2. 可变对象copy后返回的对象是不可变的,mutableCopy后返回的对象是可变的。

容器类对象的深拷贝、浅拷贝

容器类对象:Array,diction这些能包含其他对象的叫做容器类

NSArray *array01 = [NSArray arrayWithObjects:@"a",@"b",@"c", nil nil];  
NSArray *copyArray01 = [array01 copy];  
NSMutableArray *mutableCopyArray01 = [array01 mutableCopy];  
  1. copyArray01和array01指向的是同一个对象,包括里面的元素也是指向相同的指针。
  2. mutableCopyArray01和array01指向的是不同的对象,但是里面的元素指向相同的对象,mutableCopyArray01可以修改自己的对象。
  3. copyArray01是对array01的指针复制(浅复制),而mutableCopyArray01是内容复制。

上面的是不可变容器NSArray,这里测试下可变容器NSMutableArray:

NSMutableArray *array01 = [NSMutableArray arrayWithObjects:@"a",@"b",@"c", nil nil];  
NSArray *copyArray01 = [array01 copy];  
NSMutableArray *mutableCopyArray01 = [array01 mutableCopy];  

总结:1. 容器对象和非容器对象类似,可变对象复制(copy,mutableCopy)的都是一个新对象;不可变对象copy是浅复制,mutableCopy是深复制。

  1. 对于容器而言,元素对象始终是指针复制。

相关文章

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

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

  • iOS面试题-第二页

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

  • iOS - copy 与 mutableCopy

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

  • 浅拷贝和深拷贝(copy和mutableCopy)的详解

    一、浅拷贝和深拷贝的定义关于浅拷贝和深拷贝是如何定义的,可能不同的人有不同的理解。据我了解(不知道有没有偏差),苹...

  • JS中的深拷贝与浅拷贝

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

  • iOS--拷贝相关题

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

  • 深拷贝VS浅拷贝

    深拷贝VS浅拷贝 本文主要对深拷贝&浅拷贝的解释及实现做一下简单记录。 之所以会有深拷贝与浅拷贝之分,是因为不同数...

  • iOS 中浅拷贝,深拷贝和完全深拷贝

    先说结论:OC中有浅拷贝和深拷贝,浅拷贝只是对地址的引用,深拷贝是单独复制一份,两者地址不同。但是OC中的深拷贝并...

  • 深拷贝和浅拷贝不同

    浅拷贝:指针(地址)拷贝,不会产生新对象深拷贝:内容拷贝,会产生新对象 非容器类对象的深拷贝、浅拷贝 非容器类对象...

  • copy和mutableCopy的区别

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

网友评论

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

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