OC 中 的copy 功能 深复制 和 浅复制 的 区别
2015-07-28 21:15
169 查看
系统的类要是实现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操作。 本质:没有产生新对象。
相关文章推荐
- 改进版通过Json对象实现深复制的方法
- Java中的深拷贝(深复制)和浅拷贝(浅复制)介绍
- Java中对象的深复制(深克隆)和浅复制(浅克隆)介绍
- C#浅复制和深复制
- object-c 深复制和浅复制
- 浅谈深复制和浅复制
- 结构体的浅copy和深copy
- C++ 拷贝构造函数与赋值函数
- iPhone App开发实战手册学习笔记(4)之数据处理
- 【Leetcode】Copy List with Random Pointer
- java深复制和浅复制
- Java如何复制对象
- Java Clone
- 设计模式之原型模式
- js 深复制(深拷贝)和浅复制(浅拷贝)的区别
- iOS 集合的深复制与浅复制
- javascript中的深复制
- 9项目二我的数组类
- Vim2.1-Vim简明教程【CoolShell】【非原创】
- Remote Desktop Connection from Windows 7 to Ubuntu 12.04