2012-02-14 7 views
8

私は、AppleのドキュメントとCocoaのデザインパターンを読んでみるのは混乱しています。 copyWithZone:のためのアップルのドキュメントでは、それは読む:copyまたはcopyWithZoneを上書きする:またはその両方?

このメソッドは、そのクラスのオブジェクトが あなたがNSCopyingプロトコルに準拠したオブジェクトを必要とする状況で使用することができますが存在します。 の例では、このメソッドを使用すると、 NSDictionaryオブジェクトのキーとしてクラスオブジェクトを使用できます。このメソッドをオーバーライドしないでください。

copyにとっては読む:

これはNSCopying プロトコルを採用するクラスのための便利なメソッドです。 copyWithZone: の実装が存在しない場合は例外が発生します。

NSObject自体でNSCopyingプロトコルをサポートしていません。サブクラス は、プロトコルをサポートし、copyWithZone:メソッドを実装する必要があります。 サブクラスのcopyWithZone:メソッドは、サブクラス がNSObjectから直接降下しないかぎり、メッセージ をsuperに送信して実装を組み込む必要があります。 Cocoaのデザインパターンの例で

、彼らはcopyWithZone:mutableCopyWithZone:をオーバーライドしますがNSCopyingプロトコルに準拠するときcopyを上書きしません。 NSDictionaryのカスタムサブクラスをキーとして使用する場合は、どうすればいいですか?

copyを上書きしますか?

同様に、私が[myClass copy]を実行すると、そのカスタムサブクラスではcopyWithZone:またはcopyが呼び出されますか?ありがとう。

答えて

14

これはかなり簡単です。copyのデフォルトの実装では、NULL引数を使用してcopyWithZone:が呼び出されます。常にcopyWithZone:を実装する必要があります。しかし、メモリゾーンはiOS上で(私が知る限り)使用されていないので、想定しないでゾーンを無視する必要があります。

編集:手の込んだ、あなた同様copyを実装するかもしれませんが、あなたはあなたがスーパークラスの利便性を利用し続けることができNSDictionaryはiOSの6で

0

を呼ぶそれらのかを知ることはありませんので、あなたcopyWithZone:を実装する必要がありますメソッドはそのままですが、何もしませんが、いずれにしてもcopyWithZone:を呼び出します。

これは、任意の便利な方法に当てはまるはずです。あなたは彼らがどのような方法で呼んでいるのかを突き止め、代わりにそれを上書きするべきです

また、ゾーンはもはや使用されませんが、この方法では互換性と歴史的な理由からこのパラメータがあります。

関連する問題