1

以下のようなコードがあります。Web サーバーから JSON を取得しています。

AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON)
                                     {    

                                         for (NSMutableDictionary * dataDict in JSON) {


                                             if ([dataDict objectForKey:@"userPicture"])
                                             {

                                                objectForKey:@"userPicture"]);
                                                 NSURL *url = [NSURL URLWithString:[dataDict objectForKey:@"userPicture"]];
                                                 UIImage *image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];     


                                                 [dataDict setValue:@"userPicture"
                                                             forKey:@"userPicture"]; 


                                             } 


                                             [messageList addObject: dataDict];
                                         }                                             

                                         [self processComplete];

                                     } 
                                    failure:^(NSURLRequest *request , NSURLResponse *response , NSError *error , id JSON)
                                     {
                                         NSLog(@"Failed: %@", error);        

                                     }];

ただし、次のエラーでクラッシュします。

*** キャッチされない例外 'NSInternalInconsistencyException' が原因でアプリを終了します。理由: '-[__NSCFDictionary setObject:forKey:]: 変更メソッドが不変オブジェクトに送信されました'

今、私が得られないのは、setValue:forKeyインスタンス化されたdataDictでしようとしてNSMutableDictionaryいるので、setValueを実行できるはずです。

4

2 に答える 2

4

dataDict を NSMutableDictionary として宣言しましたが、それは JSON から変更可能な辞書を取得するという意味ではありません。あなたができることは、JSONシリアライザーに変更可能なコピーを取得するように指示するか(そのようなオプションをサポートしている場合)、手動でこれを行うことです:

for (NSDictionary *dict in JSON) {

    NSMutableDictionary * dataDict = [dict mutableCopy];
    // Rest of the code here...

}
于 2012-04-12T11:46:11.453 に答える
1

dataDict単なるポインターであり、インスタンス化されていません。

実際には simple を扱っているNSDictionaryため、変更することはできません。変更する必要がある場合は、それを呼び出しmutableCopyてください。これにより、オブジェクトの所有者になるため、ARC を使用していない場合は、完了したら解放することを忘れないでください。

于 2012-04-12T11:45:59.033 に答える