【问题标题】:setValue forKey in NSMutableDictionary crashesNSMutableDictionary 中的 setValue forKey 崩溃
【发布时间】:2012-04-12 11:39:58
【问题描述】:

我有如下代码。我正在从 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:]: 变异方法发送到不可变对象'

现在,我不明白的是,我正在尝试在 dataDict 中 setValue:forKey,它被实例化为 NSMutableDictionary,所以我应该能够设置值。

【问题讨论】:

    标签: objective-c ios nsmutabledictionary


    【解决方案1】:

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

    for (NSDictionary *dict in JSON) {
    
        NSMutableDictionary * dataDict = [dict mutableCopy];
        // Rest of the code here...
    
    }
    

    【讨论】:

    • 记得发布dataDict
    • @jrtc27 是的。我只是想强调可变部分(如果那个人正在使用 ARC,现在也没有)。
    • 他可能正在使用 ARC。我经常忘记它,因为我的项目都没有使用它。
    • 非常感谢。这对我帮助很大。我想我将不得不更加熟悉指针和东西的工作原理:) 非常感谢!......并且只是为了记录。我正在使用 ARC。这有什么缺点吗?
    • 事实上,Apple 不鼓励您这样做。当然,了解手动内存管理总是一个好主意,但 ARC 是一项全新的技术,最终将成为标准。
    【解决方案2】:

    dataDict 只是一个指针,没有被实例化。

    你实际上是在处理简单的NSDictionary,所以你不能修改它。如果您需要修改它,只需调用 mutableCopy 即可。这将使您成为对象的所有者,因此,如果您不使用 ARC,请记住在完成后释放它。

    【讨论】:

    • 换句话说,将对象类型转换为可变字典不会使其成为可变字典。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多