iOS深拷贝和浅拷贝

来源:互联网 发布:淘宝口令红包怎么抢 编辑:程序博客网 时间:2024/06/04 19:37

深浅拷贝

浅拷贝:指针拷贝,指针增加一份,内容不变,原有内容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协议的实现.

0 0