深浅拷贝
浅拷贝:指针拷贝,指针增加一份,内容不变,原有内容retainCount加1
深拷贝:内容拷贝,指针内容都增加一份,原有内容retainCount不变
对于非容器类不可变对象
方法 | 复制类型 | 结果可变性 |
---|---|---|
copy | 指针复制 | immutable |
mutableCopy | 内容复制 | mutable |
copyWithZone: | 指针复制 | immutable |
mutableCopyWithZone: | 内容复制 | mutable |
对于非容器类可变对象
方法 | 复制类型 | 结果可变性 |
---|---|---|
copy | 内容复制 | immutable |
mutableCopy | 内容复制 | mutable |
copyWithZone: | 内容复制 | immutable |
mutableCopyWithZone: | 内容复制 | mutable |
对于容器类对象
方法 | 复制类型-复制层级及可变性 | 结果可变性 |
---|---|---|
copy | 指针复制 - 1层 | immutable |
mutableCopy | 内容复制 - 1层 | mutable |
copyWithZone: | 指针复制 - 所有层 | immutable |
mutableCopyWithZone: | 指针复制 - 所有层 | mutable |
initWithArray:(NSArray*)array copyItems:(BOOL)flag 当flag=NO | 指针复制 - 所有层级, 所有层级可变性不变 | 结果根据创建 |
initWithArray:(NSArray*)array copyItems:(BOOL)flag 当flag=YES | 内容复制 - 1层,第二层为immutable,其他层级可变性不变 | 结果根据创建 |
Archiving and unarchiving | 内容复制-所有层,可变性不变 | 二进制文件 |
NSDictionary 和 NSSet 的 initWithXXX CopyItems: 方法结果同NSArray的一样
当使用 initWithArray:copyItems: 和 Archiving,unarchiving时候,被复制的对象要实现 copying 或 mutableCopying 协议才能被相应的复制,否则会产生异常. 而且对自建对象的拷贝结果也依赖于自建对象对copying或mutableCopying协议的实现.