天天看点

属性修饰copy;copy、mutableCopy;NSCopying NSMutableCopying

深拷贝和浅拷贝的区别是,深拷贝是开辟新的内存,创建一个新的对象,即深拷贝产生的对象,与被拷贝的对象没有必然联系。

浅拷贝是拷贝当前对象的地址,即拷贝出来的对象的指针和被拷贝的对象的指针相同,当一个对象被修改的时候,另一个对象从相同的地址取到的内容也会被修改。

NSCopying ,  NSMutableCopying 协议是指,当你想要在自定义类中使用copy,或者mutableCopy的时候,需要实现-(id)copyWithZone(NSZone *)zone

或者 - ( id )mutableCopyWithZone:( NSZone  *)zone 这两个方法,而且在创建对象的时候要用[self class]来创建,因为在子类中可能新的属性存在,导致还是父类。

copy和mutableCopy在NSString和NSArray等类中有广泛的使用,具体是深拷贝还是浅拷贝,自己试一下,打印一下地址看一下就了解了,具体代码在下面,感兴趣的可以自己试一下。

NSString *str1 = [NSString stringWithFormat:@"string"];

        NSString *string2 = [str1 mutableCopy];

        NSMutableString *str2 = [str1 copy]; // 将一个不可变字符串赋值给一个可变字符串,当修改 str2 时,爆炸。。。。

        str1 = [str1 stringByAppendingString:@"1"];

        NSLog(@"(%@)地址:%p", string2, string2);

        NSLog(@"(%@)地址:%p", str1, str1);

        NSLog(@"(%@)地址:%p", str2, str2);

(string)地址:0x600000070dc0

(string1)地址:0x600000051ee0

(string)地址:0xa00676e697274736

当执行str1 copy 时,str2 指向该 0x600000051ee0 地址的对象,当执行 str1 = [str1 stringByAppendingString:@"1"];时,

str1 已经不再指向该 0x600000051ee0 地址的对象,而是指向0xa00676e697274736地址下的对象。

在oc中,= 是用来传递地址的,[str1 stringByAppendingString:@"1"]是一个新的对象,有一个新的地址。