首页 > 代码库 > oc中深拷贝与浅拷贝

oc中深拷贝与浅拷贝

              shallow 浅拷贝       Deep深拷贝  

1、产生一个新对象,对象的内容与源对象相同

 

2、源对象与新对象使用不同的内存区域

 

3、需要NSCopying 或者NSMutableCopying协议才能使用复制功能

?

4、Fundation中得基础数据类型如Nsstring、NSNumber 等都实现了NSCopying

 

5、新对象的引用计数为1

 

6、copy与mutableCopy的区别

        copy返回不可变对象(包括可变对象在内)

      ? mutableCopy返回可变对象

 

7、浅拷贝只复制对象本身,而不会复制对象引用的其他对象

 

8、深拷贝除了复制对象本身,还会复制对象所引用的其他对象

 

9、Foundation框架里支持拷贝的类,默认是浅拷贝

 

 

retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。

 

copy:对于可变对象为深复制,引用计数不改变;对于不可变对象是浅复制,

         引用计数每次加一。始终返回一个不可变对象。

 

mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。

 

不可变对象:值发生改变,其内存首地址随之改变。

   可变对象:无论值是否改变,其内存首地址都不随之改变。

   引用计数:为了让使用者清楚的知道,该对象有多少个拥有者(即有多少个指针指向同一内存地址)。

 

 最近有一个好朋友问我,什么时候用到深浅复制呢?那么我就把我所总结的一些分享给大家,希望能帮助你们更好的理解深浅复制!

 

那么先让我们来看一看下边数组类型的转换

1、不可变对象→可变对象的转换:

       NSArray *array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

       NSMutableArray  *str2=[array1 mutableCopy];

2、可变对象→不可变对象的转换:

    NSMutableArray *array2   = [NSMutableArray arrayWithObjects:@"aa",@"bb",@"cc",@"dd",nil];

       NSArray *array1=[  array2    Copy];

3、可变对象→可变对象的转换(不同指针变量指向不同的内存地址)

       NSMutableArray *array1= [NSMutableArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

       NSMutableArray  *str2=[array1 mutableCopy];

通过上边的两个例子,我们可轻松的将一个对象在可变和不可变之间转换,并且这里不用考虑内存使用原则(即引用计数的问题)。没错,这就是深拷贝的魅力了。

4、同类型对象之间的指针复制(不同指针变量指向同一块内存地址):

  a、

   NSMutableString *str1=[NSMutableString stringWithString:@"two day"];

   NSMutableString *str2=[str1   retain];

   [str1  release];

  b、

   NSArray *array1= [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",nil];

   NSArray  *str2=[array1 Copy];

   [array1 release];

 

   通俗的讲,多个指针同时指向同一块内存区域,那么这些个指针同时拥有对该内存区的所有权。所有权的瓜分过程,这时候就要用到浅拷贝了。