美文网首页
22: 理解NSCopying协议

22: 理解NSCopying协议

作者: KKLinJJ | 来源:发表于2017-04-10 21:13 被阅读50次

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协议

  • 深拷贝浅拷贝的对比图

Paste_Image.png
  • 复制对象时应该决定是深拷贝还是浅拷贝,一般情况下是浅拷贝,如果你所写的对象需要深拷贝,那么需要新增一个专门执行深拷贝的方法

相关文章

  • 《Effective Objective-C 2.0 》 阅读笔

    第22条:理解NSCopying协议 1. NSCopying协议 如果想令自己的类支持拷贝操作,必须实现NSCo...

  • 22: 理解NSCopying协议

    1.NSCopying协议 若想令自定义对象具有拷贝功能,则需要实现NSCopying协议 实现copyWithZ...

  • 理解NSCopying协议

    1.哪些具体的代码用到了NSCopying协议呢? 以NSArray为例: 具体解释: 2.进一步了解NSCopy...

  • 理解NSCopying协议

    使用对象时经常需要拷贝它,如果想令自己的的类支持拷贝操作,那么就要实现NSCopying协议,该协议只有一个方法:...

  • 第22条:理解NSCopying协议

    使某个类支持拷贝功能,只需声明该类遵从NSCopying协议,并且实现copyWithZone方法即可。 通常情况...

  • 《编写高质量iOS与OS X代码的52个有效方法》22-27

    第22条:理解NSCopying协议 NSZone是以前开发程序时,会据此把内存分成不同的区(zone),而对象会...

  • 52个有效方法(22) - 理解NSCopying协议

    NSCopying协议 若想令自己所写的对象具有拷贝功能,则需要实现NSCopying协议。 方法中应该用全能初始...

  • 让自己创建的类具备Copy功能

    对于对象具有拷贝功能,则需实现 NSCopying 协议。 声明该类遵从 NSCopying 协议 实现 NSCo...

  • NSCopying协议

    NSCopyingNSCopying是一个与对象拷贝有关的协议。如果想让一个类的对象支持拷贝,就需要让该类实现NS...

  • NSCopying协议

    先来看一段代码 在删除arr1第一个元素的同时,arr2的第一个元素也被删除了,这很好理解,因为两个对象都指向同一...

网友评论

      本文标题:22: 理解NSCopying协议

      本文链接:https://www.haomeiwen.com/subject/joleattx.html