strong 和 copy

本文探讨了Objective-C中strong与copy修饰符的区别及应用场景。通过实例对比,阐述了两者在处理不可变与可变数据类型时的行为差异。

之前,在阅读别人的代码的时候,一直都很疑惑,为什么有的属性用strong,而有的属性用copy,感觉非常的混乱。原来这里面有有所讲究的,像NSArray,NSString, 为防止赋值给它的数据是可变数据,一般会要求用copy;如果赋值给它们的数据是可变数据,则它们会深拷贝一份,而不是简单的将指针指向可变数据的地址,这样可变数据发生变化时,不会影响到它们;如果赋值给它们的数据是不可变数据,则同strong一样,简单将指针指向不可变数据的地址。

示例

先简单做一个测试来验证一番:

image
image

从以上代码和输出我们可以看到,将不可变数组array赋值给array1(strong)array2(copy),其输出没有任何区别,都指向同一个地址 0x7fc19a581800; 而可变数组mutArray赋值给array3(strong)array4(copy), 在修改了mutArray的值后,array3mutArray一样发生变化,而array4没有发生变化;其中array3mutArray地址一样,都是0x7c19a5710c0;而array4的不同,是0x7fc19a57da20.

为什么会这样呢?

其实,是因为这两个不同的修饰符所对应的setter方法不同导致的。

  1. strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
  2. copy对应的setter方法,是将_property先release(_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值