以下是对copy和mutableCopy的一些个人理解,如有不当请多多指正。
定义
1.copy:不可变复制
2.mutableCopy:可变复制
对receiver的要求不一样
1.copy:receiver必须实现NSCopying协议
2.mutableCopy:receiver必须实现NSMutableCopying协议
执行效果不一样
1.如果receiver是不可变容器
1)copy:返回receiver,并且receiver的引用计数加1,等效于retain
2)mutableCopy:由receiver中的数据构造一个新的可变实例
2.如果receiver是可变容器
1)copy:由receiver中的数据构造一个新的不可变实例
2)mutableCopy:由receiver中的数据构造一个新的可变实例
3.原因
为什么SDK对不同类型的receiver会产生如此多种结果。主要考虑以下方面
1)达到定义要求的效果。(参考上面定义中的描述)
2)尽量节省资源开销。
基于这第2)点。所以当receiver是不可变容器的时候,接收到copy消息时。只要达到retain的效果就可以了。这样一方面可以满足定义的要求,另一主面可以节省资源。
4.特定应用
1)为什么property声明中只有“copy”特性而没有“mutableCopy”特性。这是由于当声明property为"copy"特性时,系统会自动根据receiver的特点决定使用copy(已含retain的情况)还是mutableCopy。
2)所以对于容器类的property特性一般使用“copy”而不使用“retain”,交由系统根据receiver自己决定以达到最好的效果。