深拷贝和浅拷贝不同

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

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

非容器类对象: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. 对于容器而言,元素对象始终是指针复制。

你可能感兴趣的:(深拷贝和浅拷贝不同)