首页 > 代码库 > OC —— 拷贝

OC —— 拷贝

一、什么是拷贝

在 OC 中,可以使用两个方法分别对一个 OC 对象进行拷贝(产生副本),这两个方法是

- (id)copy;
- (id)mutableCopy;

如果想使用 copy 方法,那么该类必须遵守 <NSCopying> 协议

如果想使用 mutableCopy 方法,那么该类必须遵守 <NSMutableCopying> 协议

 

在看它们的区别之前,我们先来解释一下拷贝的分类

 

拷贝的分类 

  1)浅拷贝 : 即指针拷贝,简单的说就是拷贝指针,不会产生新的对象,原对象的 引用计数 +1

  2)深拷贝 : 会产生一个新的对象,原对象的引用计数不变,新对象的引用计数为 1

 

注意 : 只有不可变对象(NSString、NSArray、NSDictionary等)调用 copy 方法才是浅拷贝,其余都是深拷贝

 

copy 和 mutableCopy 方法的区别

  1)copy : 创建的是一个不可变对象(NSString、NSArray、NSDictionary)

  2)mutableCopy : 创建的是一个可变的对象 (NSMutableString、NSMutableArray、NSMutableDictionary)

 

二、拷贝示例

 

1)不可变对象调用 copy

 1 void test_2() {
 2 
 3     // 引用计数 : 1
 4     NSString * str_1 = [[NSString alloc] initWithFormat:@"age is %i", 10];
 5     
 6     // copy 语法并没有产生一个新的对象,而是指向原来的对象
 7     // 引用计数 : 2
 8     NSString * str_2 = [str_1 copy];
 9     
10     NSLog(@"str_1 --- %p", str_1);
11     NSLog(@"str_2 --- %p", str_2);
12     
13     [str_1 release];
14     
15     [str_1 release];
16     
17 
18 }

 

运行结果

技术分享

总结 : 可见,不可变对象调用 copy 方法不会产生新的对象,如图

技术分享

 

2)可变对象调用 copy

 1 void test_3() {
 2 
 3     NSMutableString * mulString = [NSMutableString stringWithFormat:@"age is %i", 10];
 4     
 5     // 可变对象调用 copy 是深拷贝
 6     NSString * str = [mulString copy];
 7     
 8     NSLog(@"mulString --- %p", mulString);
 9     NSLog(@"str --- %p", str);
10 
11     [mulString release];
12     
13     [str release];
14 
15 }

运行结果

技术分享

总结 : 可变对象调用 copy 是深拷贝,会产生新的对象,如图

技术分享

 

3)不可变对象调用 mutableCopy

 1 void test_1() {
 2 
 3     // 引用计数 : 1
 4     NSString * str = [[NSString alloc] initWithFormat:@"age is %i", 10];
 5     
 6     // 产生一个新的对象
 7     // 引用计数 : 1
 8     NSMutableString * mulStr = [str mutableCopy];
 9     
10     NSLog(@"str --- %p", str);
11     NSLog(@"mulStr - %p", mulStr);
12     
13     [str release];
14     
15     [mulStr release];
16 
17 }

运行结果

技术分享

总结 : 不可变对象调用 mutableCopy 会产生一个新的对象,如图

技术分享

 

4)可变对象调用 mutableCopy

 

 1 void test_4 () {
 2 
 3     // 引用计数 1
 4     NSMutableString * mulString = [[NSMutableString alloc] initWithFormat:@"age is %i", 10];
 5     
 6     // 可变对象调用 mutableCopy 产生新的对象
 7     // 引用计数 1
 8     NSMutableString * mulString_2 = [mulString mutableCopy];
 9     
10     NSLog(@"mulString --- %p", mulString);
11     NSLog(@"mulString_2 --- %p", mulString_2);
12     
13     [mulString release];
14     
15     [mulString_2 release];
16 
17 }

 

运行结果

技术分享

总结 : 可变对象调用 mutableCopy 会产生一个新的对象,如图

技术分享

 

OC —— 拷贝