先日書いた「ペア要素をキーにしたNSDictionary」という記事でNSDictionaryのキーにしたPairクラスはNSCopying
プロトコルを実装するように書きました。
このNSCopying
に関してはこれまで詳しいことを知らなかったのでヘッダーやリファレンスで調べてみました。
- あるクラスをコピー可能にする場合は
NSCopying
プロトコルを継承しておく必要がある NSCopying
プロトコルを継承するクラスはcopyWithZone:
を実装する必要がある
ということらしいです。
NSCopying
プロトコルの継承
Objective-Cクラスのインスタンスをコピーするためにcopy
というメソッドが用意されています。このcopy
メソッドは実際はcopyWithZone:
を呼び出して結果をそのまま返す実装になっているようです。
iOS Developer Libraryにはこのような記述があります。
copy
Returns the object returned by copyWithZone:.
なお、copyWithZone:
を定義していない(つまりNSCopying
を継承していない)クラスに対してcopy
メソッドを呼ぶと例外が投げられます。
つまり、自前クラスをコピーできるようにしたい場合はNSCopying
を継承してcopyWithZone:
を書いておく必要があります。
copyWithZone:
の実装
これはそもそもObjective-Cのプロトコルとはそういうものなので詳しく説明するまでもないか、、、
NSCopying
はメソッドを1つだけ持ち、それがcopyWithZone:
です。NSCopying
を継承した場合はcopyWithZone:
メソッドを定義し、適切なコピーを行う実装を書く必要があります。ちゃんとプロパティごとにコピーした要素を返すとかね。
先日の記事の例で言えば、NSDictionaryのキーになる要素は必ずcopy
されるので、NSCopying
プロトコルを継承し、適切なcopyWithZone:
の実装が必要だったというわけでした。