2012-10-19 3 views
6

は、私はそうのように、私はヘッダファイルにNSMutableDictionaryプロパティを宣言した私のプロジェクトで問題が持っていた:私はつもりですのでのiOS、NSMutableDictionary

@property (copy, nonatomic) NSMutableDictionary *DataDict ; 

今すぐ実装ファイルでは、私が先に行くと、この辞書を初期化しますそのように、それを使用します。

DataDict = [[NSMutableDictionary alloc]init]; 

今、私はこれをしたとき、私はこの辞書に何かを追加しようとする分は、私はこのエラーメッセージになるだろう:

- [__ NSDictionaryIのsetObject:forKey:]:51:56.040試験[2297:C07]未認識セレクタインスタンス0x885ae60 2012年10月19日16に送られたアプリを終了* キャッチされない例外により 'NSInvalidArgumentException' に、理由: 「 - [__ NSDictionaryI のsetObject:forKey:]:認識されていないセレクタがインスタンス0x885ae60に送られた」しばらくして、私のプロジェクトを通じて千回を実行している

、私はそうのように、私の初期の行のコメントを解除することを決め

//DataDict = [[NSMutableDictionary alloc]init]; 

とその問題を修正しました。

私の質問は:なぜですか?

答えて

15

問題はあなたのプロパティを定義した方法にあります。あなたはそれを変更する場合:

@property (strong, nonatomic) NSMutableDictionary *DataDict ; 

代わりのcopyすべては問題ないはずです。

これは、基本的に、生成されたアクセサを介してオブジェクトのコピーが必要であると言っているので、代わりにNSDictionary(不変のコピー)を返します。

objective-c properties hereで詳細を見つけることができます。

objective-c ivarsは通常、小文字で始まります(大文字の名前はクラスに使用されます)。dataDictDataDictより優先する必要があります。

+0

ありがとう、私はそれらを読まなければなりません。 – Kalamantina

+0

これは、リファレンスを強くし、initを割り当てるべきであるということですか?またはそれを強くしてinitを割り当てる必要はありませんか? – Kalamantina

+0

それを「強くする」ことによって、そのオブジェクトとの強い関係(所有)を維持したいと言っているだけです(これは基本的に、所有者が割り当てを解除するときに割り当てを解除することを意味します)。あなたはまだオブジェクトをいつものようにalloc/initする必要があります。 – Alladinian

2

NSMutableDictionaryのインスタンスalloc/init-edが "copy"メソッドを使用して "コピー"され、NSMutableDictionaryではなくNSDictionaryを作成する "copy"メソッドがあるためです。 ( "mutableCopy"はNSMutableDictionaryを作成します)。

おそらく、属性として「コピー」ではなく「保持」を使用できます。

@property (retain, nonatomic) NSMutableDictionary *DataDict ; 

または、「コピー」/「保持」せずにARC(自動参照カウント)を使用するだけです。

関連する問題