Copy
copy要从几个方面说
以字符串为例,
copy mutableCopy
不可变字符串 同一个实例 不同实例,可变
可变字符串 不同实例,不可变 不同实例,可变
以数组为例(集合)
copy mutableCopy
不可变数组 相同集合实例,元素实例 不同集合实例,相同元素实例,可变
可变数组 不同集合实例,相同元素实例,不可变 不同集合实例,相同元素实例,可变
mutableCopy于可变和不可变对象是一致的,生成新的可变实例(如果是集合,得到集合实例,但是集合元素指向的实例是相同的),copy于不可变对象没有实例生成,于可变对象生成新的不可变实例
ps:我们使用mutableCopy拷贝一个不可变数组,得到不同的集合实例,虽然元素实例相同,但是数组内指向元素实例的指针与之前是不同的,这点要清楚。
对于集合,这还没有完
NSArray 实例方法
- (id)initWithArray: copyItems:;
如果传入YES,会对原数组元素指向的实例进行复制,但也只是一层复制。
例如,原数组元素既有字符串,又有数组。那么,会生成字符串实例和数组实例,但是数组实例中元素指向的实例未变
完全复制?
要想对多层集合对象进行复制,我们需要进行完全复制,这里可以使用归档和接档。
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:obj]];
自定义类
自定义类的对象,如果想要调用 copy或mutableCopy,则需要遵循NSCopying/NSMutableCopying协议,实现copyWithZone/mutableCopyWithZone方法