copy-mutableCopy

  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];
原文地址:https://www.cnblogs.com/CJDog/p/5127467.html