看到标题就很low,copy方法有什么好探索的,接下来我们一步一步的看个究竟吧。
0、说在前面的话
先来看一下下面的代码:
主要是关于NSArray的copy与mutableCopy的使用, 看上去没有什么问题。是的,就是这么简单。那么这篇文章即将要介绍的是什么呢?
其实上面的例子很简单是因为系统已经已经处理了两个协议:NSCopying 与 NSMutableCopying,这两个协议到底有什么作用呢?请看下一个小标题。
PS: 在上图中, hgArray与hgcCopyArray的地址是一样的0x6040000326a0, 这是另一个小知识了, 所谓的深拷贝与浅拷贝,网上资料一大堆,不再重复。
1、自定义类的copy与mutableCopy
创建一个继承于NSObject的子类HGObject。然后弄一个以下操作:
很明显Crash了, 提示没有找到copyWithZone:方法。是的,这是一个协议方法,必须要遵循NSCopying协议才行。应该是这样的:
这样就没有问题了,从上面代码中也能看到copyWithZone:方法的作用就是重新开辟内存空间。那么问题又来了,在子类中还需要重写copy方法么?
一般情况是不需要了, 因为调用copy方法之后, 就直接去调用NSCopying协议中的方法了。意思就是[super copy]这句代码一定会调用这个方法copyWithZone:。
同理, NSMutableCopying 与 NSCopying是一样的!
小总结:
- 1. 在继承于NSObject(或者子类)的子类中, 想要实现copy的功能,务必要重写copyWithZone:方法。
- 2. 一般情况下, 没有必要重写copy方法,因为执行[super copy]之后一定会执行copyWithZone:方法。
2、用处
在实际开发中, 很少在自定义的子类中去调用copy与mutableCopy方法。其中有一个地方会用到,为了单例设计的严谨性, 需要考虑到这两个方法的重写。