码迷,mamicode.com
首页 > 其他好文 > 详细

OC 中 的copy 功能 深复制 和 浅复制 的 区别

时间:2015-07-28 23:18:44      阅读:175      评论:0      收藏:0      [点我收藏+]

标签:copy功能   深复制   浅复制   深复制和浅复制的区别   

系统的类要是实现copy拷贝的功能,必须先签订拷贝NSCopying的协议,然后实现对应的方法

在.h文件中得@interface Boy : NSObject 的后面需要签订拷贝NSCopying的协议

例子: 在.h文件中
@interface Boy : NSObject<NSCopying>

1. Boy类使用copy的方法

例子:
Boy *boy =[Boy boyWithName:@"zhangyangyang" hobby:@"wan"];
Boy *newBoy =[boy copy];
NSLog(@"%@",newBoy.name);
NSLog(@"%ld", boy.retainCount);
NSLog(@"%ld", newBoy.retainCount);
结果:2015-07-28 19:59:46.158 OC08,09_内存管理[390:9109] zhangyangyang
2015-07-28 20:00:47.101 OC08,09_内存管理[399:9588] 1
2015-07-28 20:00:47.101 OC08,09_内存管理[399:9588] 1

注意:
1.如果自己的类想要实现copy的功能,就必须先签订NSCopying,然后实现对应的协议方案,之后就可以使用copy功能了

2.copy也可以改变引用计数,但是他改变的是新对象的引用计数,而原来的对象计数不变

2.mutableCopy

不可变的数组字典可以通过mutableCopy转换成可变的数组字典
不可变 -> 可变

例子
 NSArray *arr =@[@"1",@"2",@"3",@"4"];
 NSMutableArray *arr2=[arr mutableCopy];
 [arr2 addObject:@"5"];
  NSLog(@"%@",arr2);
  2015-07-28 20:42:10.938 OC08,09_内存管理[616:23792] (
    1,
    2,
    3,
    4,
    5
)

不可变的数组字典还可以通过便利构造器转换成可变的数组字典

例子:
 NSArray *arr =@[@"1",@"2",@"3",@"4"];
 NSMutableArray *arr1=[NSMutableArray arrayWithArray:arr];
 [arr1 addObject:@"5"];
 NSLog(@"%@",arr1);
 2015-07-28 20:42:10.939 OC08,09_内存管理[616:23792] (
    1,
    2,
    3,
    4,
    5
)

在copy功能中还有一点要注意:

一定要注意的那就是浅复制问题:
所谓浅复制就是copy出来的副本和原来的一样,而且都是不可变的,当这个时候因为都不可变,所以系统就不会重新分配地址,也就不会产生新的副本,那么不会产生新的对象,所有的操作都是对原对象操作

例子:
  NSString *srcStr = [NSString stringWithFormat:@"age is %d", 10];
   NSString *copyStr = [srcStr copy];   
   NSLog(@"%p %p", srcStr, copyStr);
   2015-07-28 20:19:52.406 copy -整理加深入[505:16273] 0x86803c130f79d95 --- 0x86803c130f79d95

注意:在这里引用计数是直接加在原对象上,而且两个对象一样,所以两个对象的引用计数都是2

深复制和浅复制的区别:

深复制(深拷贝、内容拷贝、deep copy):
特点:1、源对象和副本对象是不同的两个对象;
2、源对象引用计数器不变,副本对象计数器为1(因为是新产生的)。
本质:产生了新对象。
浅复制(浅拷贝、指针拷贝、shallow copy):
特点:1、源对象和副本对象是同一对象;
2、源对象(副本对象)引用计数器+1,相当于做一次retain操作。
本质:没有产生新对象。

版权声明:本文为博主原创文章,未经博主允许不得转载。

OC 中 的copy 功能 深复制 和 浅复制 的 区别

标签:copy功能   深复制   浅复制   深复制和浅复制的区别   

原文地址:http://blog.csdn.net/mltianya/article/details/47111573

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!