1. NSString、NSArray、NSDictionary 等经常使用 copy 关键字;
因为父类指针可以指向子类对象,使用 copy
的目的是为了让本对象的属性不受外界影响,使用 copy
无论给我传入的是一个可变对象还是不可变对象,我本身持有的就是一个不可变的副本,如果我们使用的是 strong
,那么这个属性就有可能指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。
2. 为什么 block 也经常使用 copy 关键字
block 使用copy
关键字是从 MRC 遗留下来的“传统”,在 MRC 中,方法内部的 block 是在栈区的,使用 copy
可以把它放到堆区。
在 ARC 中写不写都行,对于 block 使用 copy
还是 strong
效果是一样的,但写上 copy
也无伤大雅,还是能时刻提醒我们,编译器自动对 block 进行了 copy
操作。
注意
NSMutableString、NSMutableArray、NSMutableDictionary 使用 copy 应注意:
- 添加、删除、修改数组内的元素的时候,程序会因为找不到对应的方法而奔溃,因为
copy
就是复制一个不可变 NSArray 的对象。 - 使用了
atomic
属性会严重影响性能。
在非集合类对象中:
- 对 immutable 对象进行
copy
操作,是指针的复制,mutableCopy
操作是内容复制; - 对 mutable 对象进行
copy
和mutableCopy
都是内容的复制;
[immutableObject copy]; //浅复制
[immutableObject mutableCopy]; //深复制
[mutableObject copy]; //深复制
[mutableObject mutableCopy]; //深复制
网友评论