2011-06-18 4 views
0

でキーとして委譲クラスを設定しますキャッチされない例外により 'NSInvalidArgumentException'、理由にアプリを終了は、私はキーはこのように、のUIViewControllerの代表者で構成されたNSMutableDictionaryを作成しようとしているNSMutableDictionary

*: ' - [RTALocationsListViewController copyWithZone:]:認識されていないセレクタがインスタンス0x1a9750に送ら'

アンそれはどう?これを試して何か完全に間違っているのですか?私はこれに違ってアプローチするべきですか?ご協力いただきありがとうございます!

+0

一般に、キーオブジェクトには可能な限り「標準」クラスを使用する必要があります。あなたがカスタムクラスを使いたい場合、それらは 'NSCopying'プロトコル(' -copyWithZone: 'を実装)に準拠する必要がありますが、' -isEqual: 'で同じである2つのオブジェクトも同じものを返すようにする必要があります'-hash'の値を変更する必要があります。また、オブジェクトの内部状態が変更されても、オブジェクトが辞書に入っている間は' -hash'が変更されないようにする必要があります。 –

答えて

-1

NSDictionary鍵は、NSCopyingプロトコルに準拠していればどのオブジェクトでもかまいません。

エラーは、copyWithZoneがこのプロトコルの一部であり、デリゲートオブジェクトによって実装されない可能性があるためです。 - それで鍵になることはできません。

クラスの文字列表現を取得してキーとして使用しますが、同じクラスの複数のデリゲートがある場合(これはキーが一意ではないため)、これは機能しない可能性があります。または、デリゲートクラスでNSCopyingプロトコルを実装します。

+1

-1。デリゲートをコピーすることはあまり意味がありません。クラス名を使用することはあまり意味がなく、デリゲートの説明(これはクラスのアドレスが含まれているのでややユニークなはずです)を使用することは疑わしいです。最も簡単で信頼できる方法は '[NSValue valueWithNonretainedObject:lmDelegate]'をキーとして使うことです。 –

0

NSDictionaryはキーをコピーしますが、CFDictionary関数はキーをコピーしません。代わりにCFDictionaryを使用してください(または「フリーダイヤルフリーブリッジ」を利用してください)。

+0

"CFDictionary関数は「それは完全に真実ではありません。 CFDictionaryでは、セマンティクスを指定できます。つまり、キーをコピーすることができます(例えば、 'kCFCopyStringDictionaryKeyCallBacks')、それを保持するか、まったく保持しないことができます。柔軟です。 – user102008

+0

@ user102008:最後に ' - [NSMutableDictionary setValue:forKey:]'は明示的なコピーを行い、 'CFDictionarySetValue()'は明示的なコピーを行いませんでした。これは、キーコピー「CFDictionary」を作成し、フリーダイヤルで「NSMutableDictionary」にブリッジすると、キーが2回コピーされることになります。 –

関連する問題