ぴよログ

↓に移転したのでこっちは更新されません、多分。

NSCopyingって何?

移転しました →

先日書いた「ペア要素をキーにしたNSDictionary」という記事でNSDictionaryのキーにしたPairクラスはNSCopyingプロトコルを実装するように書きました。

このNSCopyingに関してはこれまで詳しいことを知らなかったのでヘッダーやリファレンスで調べてみました。

  1. あるクラスをコピー可能にする場合はNSCopyingプロトコルを継承しておく必要がある
  2. 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はメソッドを一つだけ持ち、それがcopyWithZone:です。NSCopyingを継承した場合はcopyWithZone:メソッドを定義し、適切なコピーを行う実装を書く必要があります。ちゃんとプロパティごとにコピーした要素を返すとかね。

先日の記事の例で言えば、NSDictionaryのキーになる要素は必ずcopyされるので、NSCopyingプロトコルを継承し、適切なcopyWithZone:の実装が必要だったというわけでした。