2012-04-12 56 views
1

我有像下面的代码。我从Web服务器检索JSON。setValue forKey在NSMutableDictionary崩溃

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'

现在,我不明白的是,我想在dataDict,这是实例化NSMutableDictionarysetValue:forKey,所以我应该是能够设定值。

我是菜鸟程序员,所以请与我裸:)提前

感谢, 菲舍尔

回答

4

你已经将你的dataDict声明为一个NSMutableDictionary,但这并不意味着你从你的JSON中获得了一个可变字典。你可以做的或者是指示你的JSON序列化把你接可变副本(如果它支持这样的选项)或手动执行此操作:

for (NSDictionary *dict in JSON) { 

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

} 
+0

记得发布'dataDict'。 – jrtc27 2012-04-12 12:19:11

+0

@ jrtc27是。我只是想强调一下可变部分(如果这个人正在使用ARC,现在也不会这么做)。 – Alladinian 2012-04-12 12:20:50

+0

他可能会使用ARC。我经常忘记它,因为我的项目都没有使用它。 – jrtc27 2012-04-12 12:52:08

1

dataDict只是一个指针,不会被实例化。

你实际上是在处理简单的NSDictionary,所以你不能修改它。如果你需要修改它,只需拨打mutableCopy即可。这会让你成为对象的拥有者,所以如果你不使用ARC,记得在完成后释放它。

+1

换句话说,类型转换对象对一个可变的字典里没有使它成为一个可变字典。 – Till 2012-04-12 11:47:49