您的位置:首页 > 运维架构

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

2016-08-22 10:08 387 查看
深拷贝和浅拷贝的区别是,深拷贝是开辟新的内存,创建一个新的对象,即深拷贝产生的对象,与被拷贝的对象没有必然联系。
浅拷贝是拷贝当前对象的地址,即拷贝出来的对象的指针和被拷贝的对象的指针相同,当一个对象被修改的时候,另一个对象从相同的地址取到的内容也会被修改。
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 指向该 [b]0x600000051ee0 地址的对象,当执行 str1 = [str1 stringByAppendingString:@"1"];时,[/b]

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

在oc中,= 是用来传递地址的,[str1 stringByAppendingString:@"1"]是一个新的对象,有一个新的地址。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: