1.NSCopying协议
若想令自定义对象具有拷贝功能,则需要实现NSCopying协议
- 实现copyWithZone方法
方法中应该用全能初始化方法,来初始化待拷贝的对象
<pre><code>//.h</code>
<code>@interface Person : NSObject <NSCopying></code>
<code> @property (nonatomic,copy) NSString *name;</code>
<code> @property (nonatomic,readonly) NSArray *friends;</code>
<code> @property (nonatomic,assign) int age;</code>
<code> - (instancetype)initWithName:(NSString *)name age:(int)age;</code>
<code>@end</code>
<code>//.m</code>
<code>@interface Person ()</code>
<code> @property (nonatomic,readwrite,strong) NSMutableArray *friends;</code>
<code>@end</code>
<code>@implementation Person</code>
<code> - (instancetype)initWithName:(NSString *)name age:(int)age</code>
<code> {</code>
<code> self = [super init];</code>
<code> if (self) {</code>
<code> self.name = name;</code>
<code> self.age = age;</code>
<code> _friends = [NSMutableArray array];</code>
<code> }</code>
<code> return self;</code>
<code>}</code>
<code>... </code>
<code>- (id)copyWithZone:(NSZone *)zone{</code>
<code> Person *p = [[[self class] allocWithZone:zone] initWithName:_name age:_age];</code>
<code> return p;</code>
<code>}</code>
<code>@end</code></pre>
- 如果全能初始化不能满足要求,还应该手动的加上一些操作
<pre><code> //.h</code>
<code> @interface Person : NSObject <NSCopying></code>
<code> @property (nonatomic,copy) NSString *name;</code>
<code> @property (nonatomic,readonly) NSArray *friends</code>
<code> @property (nonatomic,assign) int age;</code>
<code> - (instancetype)initWithName:(NSString *)name age:(int)age;</code>
<code> @end</code>
<code> //.m</code>
<code> @interface Person ()</code>
<code> @property (nonatomic,readwrite,strong) NSMutableArray *friends;</code>
<code> @end</code>
<code> @implementation Person</code>
<code> - (instancetype)initWithName:(NSString *)name age:(int)age</code>
<code> {</code>
<code> self = [super init];</code>
<code> if (self) {</code>
<code> self.name = name;</code>
<code> self.age = age;</code>
<code> _friends = [NSMutableArray array];</code>
<code> }</code>
<code> return self;</code>
<code> }</code>
<code> ... </code>
<code> - (id)copyWithZone:(NSZone *)zone{</code>
<code> Person *p = [[[self class] allocWithZone:zone] </code><code>initWithName:_name age:_age];</code>
<code> p->_friends = [_friends mutableCopy]; //额外的代码</code>
<code> return p;</code>
<code> }</code>
<code>@end</code></pre>
如果自定义对象分为可变版本和不可变版本,那么就要同时实现NSCopying与NSMutableCopying协议
深拷贝浅拷贝的对比图
- 复制对象时应该决定是深拷贝还是浅拷贝,一般情况下是浅拷贝,如果你所写的对象需要深拷贝,那么需要新增一个专门执行深拷贝的方法