copy 关键字

为什么要写这篇博客,面试的时候有可能会遇到这样的面试题:用@property声明的NSString(或NSArray,NSDictionary)经常使用copy关键字,为什么?如果改用strong关键字,可能造成什么问题?
首先搞懂copy十分重要;

  • 是什么
    首先copy和mutableCopy是方法,是NSObject内定义的方法。还有对应的类方法copyWithZone:(struct _NSZone *)zone以及两个协议
    NSCopying和NSMutableCopying。
    其中,+copy:、+copyWithZone:简单地说,是为了让”类”对象也符合NSCopying协议,也可以作为key插入NSDictionary中。又因为类对象全局只能存在一份,所以+copy:、+copyWithZone:方法只是简单返回self,而且这两个方法在ARC环境下也是不可用的。
    对于-copy、-mutableCopy,这两个方法被调用就会产生一个新的副本对象,里面会直接把-copyWithZone:、-mutableCopyWithZone:的值返回。但是NSObject并没有实现-copyWithZone:和-mutableCopyWithZone:,所以子类对象要使用-copy、-mutableCopy就必须去实现NSCopying和NSMutableCopying协议。不过常见的NSString、NSArray、NSDictionary等都已遵守了上面两个协议。
    最后NSZone已经被Apple抛弃,可不去追究。

  • 有什么用
    copy顾名思义就是拷贝或者说克隆,所以copy的目的就是复制一份原来的内容,进一步思考为什么需要拷贝?显然:拷贝的目的就是改变原来的内容不影响副本,改变副本也不影响原来的内容

深拷贝,浅拷贝认识
copy 关键字_第1张图片
copy 关键字_第2张图片

总结:
如果对一不可变对象复制,copy是指针复制(浅拷贝)、mutableCopy就是对象复制(深拷贝)。
如果是对可变对象复制,都是深拷贝,但是copy返回的对象是不可变的。
如果没有生成新的对象, 我们称之为浅拷贝, 本质就是指针拷贝
如果生成了新的对象, 我们称之为深拷贝, 本质就是会创建一个新的对象
copy内存管理
MRC下
如果是浅拷贝:不会生成新的对象,但是系统就会对原来的对象进行retain。
如果是深拷贝:会生成新的对象,系统不会对原来的对象进行retain。
注释:借鉴别人总结经验。

你可能感兴趣的:(ios开发,mac-os)