对象的拷贝有浅复制和深复制两种方式。浅复制只复制指向对象的指针,并不复制对象本身;深复制是直接复制整个对象到另一块内存中。即浅复制是复制指针,深复制是复制内容。
NSObject提供了copy
和mutableCopy
方法,copy
复制后对象是不可变对象(immutable),mutableCopy
复制后的对象是可变对象(mutable),与原始对象是否可变无关。
非集合类对象指的是NSString
、NSNumber
之类的对象,深复制会复制引用对象的内容,而浅复制只复制引用这些对象的指针。
非集合类对象的copy
与mutableCopy
:
- 对不可变对象执行
copy
操作,是指针复制,执行mutableCopy
操作是内容复制。 - 对可变对象执行
copy
操作和mutableCopy
操作都是内容复制。
容器类对象指NSArray
、NSDictionary
等。容器类对象的深复制、浅复制如下图所示:
复制集合时,该集合、集合内元素的可变性可能会受到影响。每种方法对任意深度集合中对象的可变性有稍微不同的影响。
copyWithZone:
创建对象的最外层 surface level不可变,所有更深层次对象的可变性不变。mutableCopyWithZone:
创建对象的最外层 surface level可变,所有更深层次对象的可变性不变。initWithArray: copyItems:
第二个参数为NO
,此时,所创建数组最外层可变性与初始化的可变性相同,所有更深层级对象可变性不变。initWithArray: copyItems:
第二个参数为YES
,此时,所创建数组最外层可变性与初始化的可变性相同,下一层级是不可变的,所有更深层级对象可变性不变。- 归档、解档复制的集合,所有层级的可变性与原始对象相同。
详细介绍查看下面文章:
https://github.com/pro648/tips/wiki/深复制、浅复制、copy、mutableCopy
iOS 2.0+