说说copy和strong修饰变量的区别?这个面试题几乎是必问的!本着“纸上得来终觉浅,绝知此事要躬行”的原则,做一下自己的分析!
首先创建了四个属性,分别是两个不可变不可变数组strong修饰的sArr和copy修饰的cArr,两个可变数组strong修饰的smArr和copy修饰的cmArr。创建一个源数据可变数组originArr,其中有两个元素item0和item1。
Tips:
当我命名一个属性@property (copy, nonatomic) NSArray *copyArr
的时候,提示error:property follows cocoa naming convention for returning 'owned' objects
的错误,原因是:property的命名使用了cocoa的命名约定,也就是property的命名开头使用了保留字new、copy等,如copyString、newString等
。这些命名是不可以使用的,把名字改一下就行了。
对四个属性进行赋值和打印,可以看出sArr和smArr的地址和orignArr的地址相同,cArr和cmArr和orignArr的地址是不同的。与此同时可以看到:strong修饰的sArr和smArr的类是__NSArrayM可变数组,能够正常删除,而copy修饰的cArr和cmArr的类是__NSArrayI是不可变数组,删除的时候崩溃
结论:
1,strong修饰的变量只是做了浅拷贝,并不创建新的对象,指向原来的内存地址,得到和源数据同样的类型;
2,copy修饰的变量做了深拷贝,创建新的对象,指向不同的内存地址,并且创建的对象为不可变对象;
3,在选择strong还是copy修饰变量的时候根据具体的情况判定。如果想要一份不接受更改的数据,那就选择copy来修饰;如果想要一份能够被修改,且原数据被修改后变量也是要被修改的,那就选择strong来修饰。