标签:
copy和mutableCopy语法的目的:改变副本的时候,不会影响到源对象;调用Copy产生的对象是不可变的,调用mutableCopy产生的对象是可变的,与调用对象是否可变无关。
Copy 需要先实现NSCoppying协议,创建的是不可变副本(如字符串、数组、字典)。
mutableCopy 需要先实现NSMutableCopying协议,创建的是可变副本(如可变字符串、可变数组、可变字典)。
如果想自定义copy,那么就必须遵守NSCopying,并且实现copyWithZone:方法。
如果想自定义mutableCopy,那么就必须遵守NSMutableCopying,并且实现mutableCopyWithZone:方法。
1、不可变字符串的mutableCopy(深拷贝):// 深拷贝:内容拷贝,会产生新的对象。新对象计数器置为1,源对象计数器不变。
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10]; NSMutableString *str = [string mutableCopy]; // 产生了一个新的对象,计数器为1。源对象的计数器不变; str和string不是相同对象。
2、不可变字符串的copy(浅拷贝):// 浅拷贝:指针拷贝,不会产生新的对象。源对象计数器+1。只有一种情况是浅拷贝:不可变对象调用copy方法时。
NSString *string = [[NSString alloc] initWithFormat:@"age is %i", 10]; NSString *str = [string copy]; // copy产生的是不可变副本,由于源对象本身就不可变,所以为了性能着想,copy会直接返回源对象本身; 源对象计数器会+1; 在浅拷贝情况下,copy其实就相当于retain.
3、可变字符串的copy(深拷贝):
NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10]; NSString *str = [string copy]; // 会产生一个新对象,str计数器为1。
4、可变字符串的MutableCopy(深拷贝):
NSMutableString *string = [NSMutableString stringWithFormat:@"age is %i", 10]; NSMutableString *str = [string mutableCopy]; //会产生一个新对象,str计数器为1。
5、@property中的参数copy策略:
@property (nonatomic, copy) NSString *name; // copy代表set方法会release旧对象、copy新对象 // 修改外面的变量,并不会影响到内部的成员变量 // 建议:NSString一般用copy策略,其他对象一般用retain
6、对象的copy:
Student *stu1 = [Student studentWithName:@"stu1"]; Student *stu2 = [stu1 copy];
标签:
原文地址:http://www.cnblogs.com/CJDog/p/5127467.html