一、什么是拷贝
在 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 会产生一个新的对象,如图
时间: 2024-11-08 09:19:26