8

Apple のドキュメントを見て、Cocoa のデザイン パターンを読んで混乱しています。の Apple ドキュメントにはcopyWithZone:、次のように書かれています。

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

それは次のcopyとおりです。

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

NSObject 自体は NSCopying プロトコルをサポートしていません。サブクラスはプロトコルをサポートし、copyWithZone: メソッドを実装する必要があります。copyWithZone: メソッドのサブクラス バージョンは、サブクラスが NSObject から直接派生しない限り、最初にメッセージをスーパーに送信してその実装を組み込む必要があります。

Cocoa デザイン パターンの例では、プロトコルに準拠している場合はオーバーライドしますが、オーバーライドcopyWithZone:mutableCopyWithZone:ません。カスタムサブクラスをキーとして 使用したい場合、それは私がすべきことですか?copyNSCopyingNSDictionary

または、オーバーライドしますcopyか?

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

4

2 に答える 2

14

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

編集:詳しく説明すると、実装することもできますが、iOS 6でどちらが呼び出されるかわからないため、実装copyする必要があります。copyWithZone:NSDictionary

于 2012-02-14T18:02:05.370 に答える
0

スーパークラスの便利なメソッドは、copyWithZone:とにかく呼び出すだけなので、そのまま使い続けることができます。

これは、任意の便利なメソッドに当てはまります。それらが呼び出すメソッドを見つけて、代わりにそれをオーバーライドする必要があります。

また、上記のように、ゾーンはまったく使用されなくなりましたが、互換性と歴史的な理由から、メソッドにはまだそのパラメーターがあります。

于 2015-10-15T14:28:40.170 に答える