iOS 中对copy的探索

看到标题就很low,copy方法有什么好探索的,接下来我们一步一步的看个究竟吧。

0、说在前面的话

先来看一下下面的代码:


iOS 中对copy的探索_第1张图片
image.png

主要是关于NSArraycopymutableCopy的使用, 看上去没有什么问题。是的,就是这么简单。那么这篇文章即将要介绍的是什么呢?

其实上面的例子很简单是因为系统已经已经处理了两个协议:NSCopying 与 NSMutableCopying,这两个协议到底有什么作用呢?请看下一个小标题。

PS: 在上图中, hgArray与hgcCopyArray的地址是一样的0x6040000326a0, 这是另一个小知识了, 所谓的深拷贝与浅拷贝,网上资料一大堆,不再重复。

1、自定义类的copy与mutableCopy

创建一个继承于NSObject的子类HGObject。然后弄一个以下操作:

iOS 中对copy的探索_第2张图片
image.png

很明显Crash了, 提示没有找到copyWithZone:方法。是的,这是一个协议方法,必须要遵循NSCopying协议才行。应该是这样的:

iOS 中对copy的探索_第3张图片
image.png

这样就没有问题了,从上面代码中也能看到copyWithZone:方法的作用就是重新开辟内存空间。那么问题又来了,在子类中还需要重写copy方法么?

iOS 中对copy的探索_第4张图片
image.png

一般情况是不需要了, 因为调用copy方法之后, 就直接去调用NSCopying协议中的方法了。意思就是[super copy]这句代码一定会调用这个方法copyWithZone:

同理, NSMutableCopying 与 NSCopying是一样的!

小总结:
  • 1. 在继承于NSObject(或者子类)的子类中, 想要实现copy的功能,务必要重写copyWithZone:方法。
  • 2. 一般情况下, 没有必要重写copy方法,因为执行[super copy]之后一定会执行copyWithZone:方法。

2、用处

在实际开发中, 很少在自定义的子类中去调用copy与mutableCopy方法。其中有一个地方会用到,为了单例设计的严谨性, 需要考虑到这两个方法的重写。

你可能感兴趣的:(iOS 中对copy的探索)