之前,在阅读别人的代码的时候,一直都很疑惑,为什么有的属性用strong,而有的属性用copy,感觉非常的混乱。原来这里面有有所讲究的,像NSArray,NSString, 为防止赋值给它的数据是可变数据,一般会要求用copy;如果赋值给它们的数据是可变数据,则它们会深拷贝一份,而不是简单的将指针指向可变数据的地址,这样可变数据发生变化时,不会影响到它们;如果赋值给它们的数据是不可变数据,则同strong一样,简单将指针指向不可变数据的地址。
示例
先简单做一个测试来验证一番:
从以上代码和输出我们可以看到,将不可变数组array赋值给array1(strong)和array2(copy),其输出没有任何区别,都指向同一个地址 0x7fc19a581800; 而可变数组mutArray赋值给array3(strong)和array4(copy), 在修改了mutArray的值后,array3和mutArray一样发生变化,而array4没有发生变化;其中array3和mutArray地址一样,都是0x7c19a5710c0;而array4的不同,是0x7fc19a57da20.
为什么会这样呢?
其实,是因为这两个不同的修饰符所对应的setter方法不同导致的。
- strong对应的setter方法,是将_property先release(_property release),然后将参数retain(property retain),最后是_property = property。
- copy对应的setter方法,是将_property先release(_property release),然后拷贝参数内容(property copy),创建一块新的内存地址,最后_property = property。