copy和strong修饰变量的理解

283 阅读2分钟

说说copy和strong修饰变量的区别?这个面试题几乎是必问的!本着“纸上得来终觉浅,绝知此事要躬行”的原则,做一下自己的分析

深拷贝和浅拷贝的理解

首先创建了四个属性,分别是两个不可变不可变数组strong修饰的sArrcopy修饰的cArr,两个可变数组strong修饰的smArrcopy修饰的cmArr。创建一个源数据可变数组originArr,其中有两个元素item0item1

Tips:当我命名一个属性@property (copy, nonatomic) NSArray *copyArr的时候,提示error:property follows cocoa naming convention for returning 'owned' objects的错误,原因是:property的命名使用了cocoa的命名约定,也就是property的命名开头使用了保留字new、copy等,如copyString、newString等。这些命名是不可以使用的,把名字改一下就行了。

对四个属性进行赋值和打印,可以看出sArrsmArr的地址和orignArr地址相同cArrcmArrorignArr地址是不同的。与此同时可以看到:strong修饰的sArrsmArr类是__NSArrayM可变数组,能够正常删除,而copy修饰的cArrcmArr类是__NSArrayI是不可变数组删除的时候崩溃

结论:

1,strong修饰的变量只是做了浅拷贝,并不创建新的对象,指向原来的内存地址,得到和源数据同样的类型;

2,copy修饰的变量做了深拷贝,创建新的对象,指向不同的内存地址,并且创建的对象为不可变对象;

3,在选择strong还是copy修饰变量的时候根据具体的情况判定。如果想要一份不接受更改的数据,那就选择copy来修饰;如果想要一份能够被修改,且原数据被修改后变量也是要被修改的,那就选择strong来修饰。