2012-04-12 3 views
1

私は以下のようなコードを持っています。私はWebサーバーからJSONを取得しています。それは次のエラーでクラッシュししかしNSMutableDictionaryのsetValue forKeyがクラッシュする

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);   

            }]; 

:今

* Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '-[__NSCFDictionary setObject:forKey:]: mutating method sent to immutable object'

、私は取得しないものを、私はNSMutableDictionaryをインスタンス化されるdataDict、中setValue:forKeyにしようとしていますので、私はあるべきであるということですsetValueにできる。

私はそう私と一緒に裸してください:)事前に

おかげで、 フィッシャーを

答えて

4

あなたはdataDictをNSMutableDictionaryとして宣言していますが、JSONから変更可能な辞書を取得したわけではありません。言い換えれば

for (NSDictionary *dict in JSON) { 

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

} 
+0

'dataDict'をリリースすることを忘れないでください。 – jrtc27

+0

@ jrtc27真。私はちょうどその人がARCを使用している場合は、変更可能な部分を強調したいと思っていました。 – Alladinian

+0

彼はARCを使用している可能性があります。私のプロジェクトがそれを使用していないので、私はしばしばそれを忘れる。 – jrtc27

1

dataDictがインスタンス化されていない、単なるポインタである、新人プログラマです。

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

+1

を、それを可変することはありません可変辞書に向けてのオブジェクトを型キャスト:何あなたができることは(そのようなオプションをサポートしている場合)あなたに変更可能なコピーを取得するために、あなたのJSONシリアライザを指示するか、手動でこれを行うのいずれかであります辞書。 – Till

関連する問題