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

1 篇文章 0 订阅
深拷贝和浅拷贝的区别是,深拷贝是开辟新的内存,创建一个新的对象,即深拷贝产生的对象,与被拷贝的对象没有必然联系。
浅拷贝是拷贝当前对象的地址,即拷贝出来的对象的指针和被拷贝的对象的指针相同,当一个对象被修改的时候,另一个对象从相同的地址取到的内容也会被修改。
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"]是一个新的对象,有一个新的地址。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值