5

Personプロパティを持つというオブジェクトがsocialSecurityNumberあり、このクラスがメソッドをオーバーライドしてisEqual:、社会保障番号のプロパティが等しい場合にtrueを返すとします。そして、のインスタンスの束をに入れたとしましょPersonNSDictionary

newPersonたまたま辞書にあるものと同じ社会保障番号を持つオブジェクトをインスタンス化した場合[myDictionary objectForKey:newPerson]、それはを使用してisEqual:YESを返しますか、それともポインターを比較してNOを返しますか?

簡単なテストを書いて見つけることができることは知っていますがobjectForKey:、辞書で一致するものを正確に見つける方法と、これがCocoa全体でどの程度一貫しているかを理解したいと思います(つまり、は同じように機能しNSArrayますindexofObject:か?)

4

2 に答える 2

10

NSDictionaryハッシュテーブルのように機能します。したがって、との両方-hashを使用-isEqual:して、指定されたキーに対応するディクショナリ内のオブジェクトを検索します。

したがって、の質問に答えるためNSDictionaryに、これはisEqual:ポインタ比較ではなく使用します。ただし、これを機能させるには、クラスhashに加えて実装する必要もあります。isEqual:Person

ディクショナリ内のキーと値のペアは、エントリと呼ばれます。各エントリは、キーを表す1つのオブジェクトと、そのキーの値である2番目のオブジェクトで構成されます。辞書内では、キーは一意です。つまり、1つのディクショナリ内の2つのキーが等しくなることはありません(isEqual:によって決定されます)。

2つのオブジェクトが等しい場合、それらは同じハッシュ値を持っている必要があります。この最後の点は、サブクラスでisEqual:を定義し、そのサブクラスのインスタンスをコレクションに入れる場合に特に重要です。サブクラスでもハッシュを定義していることを確認してください。

インデックス0から開始して、一致が見つかるか、配列の最後に到達するまで、配列の各要素にisEqual:メッセージが送信されます。このメソッドは、anObjectパラメーターを各isEqual:メッセージに渡します。isEqual :( NSObjectプロトコルで宣言されている)がYESを返す場合、オブジェクトは等しいと見なされます。


常にドキュメントを読む必要があります。上記の抜粋で指摘されているように、これらの種類の詳細は、メソッドドキュメントの「ディスカッション」または「特別な考慮事項」セクション、またはクラスドキュメント自体の「概要」セクションで説明されることがよくあります。 。

于 2012-09-13T09:52:15.080 に答える
1

これはCocoa全体でどの程度一貫していますか(つまり、NSArrayのindexofObject:同じように機能しますか?)

それは一貫していると同時にそうではありません。つまり、使用できる方法は2つあります。isEqualhash。どちらがいつ使用されるかについてはあまり気にする必要はありません。代わりに焦点を当てるべきなのは、NSObjectプロトコル要件を尊重し、2つのオブジェクトが等しい場合、isEqualそれらも同じハッシュを持っていることを確認することです。

プロトコルリファレンスのドキュメントからisEqualNSObject

2つのオブジェクトが等しい場合、それらは同じハッシュ値を持っている必要があります。この最後の点は、サブクラスでisEqual:を定義し、そのサブクラスのインスタンスをコレクションに入れる場合に特に重要です。サブクラスでもハッシュを定義していることを確認してください。

于 2012-09-13T10:06:43.450 に答える