8

私のプロジェクトでは、ヘッダー ファイルで NSMutableDictionary プロパティを次のように宣言するという問題がありました。

@property (copy, nonatomic) NSMutableDictionary *DataDict ;

実装ファイルでは、このディクショナリを使用するため、次のように初期化します。

DataDict = [[NSMutableDictionary alloc]init];

これを行ったとき、この辞書に何かを追加しようとすると、次のエラーメッセージが表示されます。

-[__NSDictionaryI setObject:forKey:]: 認識されないセレクターがインスタンス 0x885ae60 2012-10-19 16:51:56.040 testing[2297:c07] に送信されまし たforKey:]: インスタンス 0x885ae60 に送信された認識されないセレクター

しばらくして、プロジェクトを何千回も実行した後、次のように初期化行のコメントを外すことにしました。

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

そしてそれは問題を修正しました。

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

4

3 に答える 3

15

問題は、プロパティを定義した方法にあります。次のように変更した場合:

@property (strong, nonatomic) NSMutableDictionary *DataDict ;

代わりに、copyすべてがうまくいくはずです。

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

Objective-C プロパティの詳細については、こちらを参照してください。

補足として、objective-civar は通常小文字で始まるため (クラスには大文字の名前が使用されます)、 よりdataDictも優先する必要がありますDataDict

于 2012-10-19T21:08:03.763 に答える
2

これは、プロパティに「copy」属性があるため、NSMutableDictionary インスタンスの alloc/init-ed が「copy」メソッドを使用して「copy」され、「copy」メソッドが NSMutableDictionary ではなく NSDictionary を作成するためです。(「mutableCopy」は NSMutableDictionary を作成します)。

おそらく、属性として「copy」の代わりに「retain」を使用できます。

@property (retain, nonatomic) NSMutableDictionary *DataDict ;

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

于 2012-10-19T21:07:12.330 に答える