先日書いた「ペア要素をキーにした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:の実装が必要だったというわけでした。