由于未捕获的异常“NSUnknownKeyException”而终止应用程序此类不符合键 .img 的键值编码

Posted

技术标签:

【中文标题】由于未捕获的异常“NSUnknownKeyException”而终止应用程序此类不符合键 .img 的键值编码【英文标题】:Terminating app due to uncaught exception 'NSUnknownKeyException' this class is not key value coding-compliant for the key .img 【发布时间】:2013-06-10 12:44:27 【问题描述】:

尝试异步加载图像我收到此错误 “由于未捕获的异常 'NSUnknownKeyException' 导致应用程序终止,原因:'[valueForUndefinedKey:]:此类不符合键值编码关键img。'" 我的代码如下

 NSString *str = "URL of an image";

    NSMutableDictionary *record = [NSMutableDictionary dictionary];
    [record setObject:str forKey:@"img"];

    record = [_array objectAtIndex:indexPath.row];



   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
    if ([record valueForKey:@"img"]) 
        NSLog(@"in if");
        cell.m_img.image =  [record valueForKey:@"img"];
     else 
        dispatch_async(queue, ^
             NSLog(@"in else");
            NSURL  *imageurl = [[NSURL alloc] initWithString:str];
            NSData *image = [[NSData alloc] initWithContentsOfURL:imageurl];

            dispatch_async(dispatch_get_main_queue(), ^
                [record setValue:[UIImage imageWithData:image] forKey:@"img"];

                [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            );
        );
    

请告知我在哪里出错了。 谢谢 马尤尔

【问题讨论】:

这一行发生了什么:record = [_array objectAtIndex:indexPath.row];?此时,变量record 持有对来自_array 的某个对象的引用,并且您不再对新创建的NSMutableArray 有任何引用。 @Theo 实际上我确实有该数组的参考.. 对不起,我的意思是你的NSMutableDictionary 没有引用了。 【参考方案1】:

替换

[record valueForKey:@"img"]

[record objectForKey:@"img"]

【讨论】:

NSDictionary 支持 KVC,因此不需要建议的更改。 当我这样做时它仍然崩溃,因为这个错误无法识别选择器发送到实例 0xe050c30' 再次替换 [record setValue:[UIImage imageWithData:image] forKey:@"img"]; with [record setObject:[UIImage imageWithData:image] forKey:@"img"]; @Adithya,我认为这不是解决方案。应用程序崩溃是因为 record 不是对 NSMutableDictionary 的引用。 MayurCM,尝试使用调试器或 NSLog(@"%@", [record description]); 来检查 record【参考方案2】:
 Check if object in array is of dictionary type

  NSString *str = "URL of an image";

    NSMutableDictionary *record = [NSMutableDictionary dictionary];

if([[_array objectAtIndex:indexPath.row]isKindOfClass:[NSDictionary class]])
    record = [_array objectAtIndex:indexPath.row];
else
      [record setObject:str forKey:@"img"];


   dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
    if ([record valueForKey:@"img"]) 
        NSLog(@"in if");
        cell.m_img.image =  [record valueForKey:@"img"];
     else 
        dispatch_async(queue, ^
             NSLog(@"in else");
            NSURL  *imageurl = [[NSURL alloc] initWithString:str];
            NSData *image = [[NSData alloc] initWithContentsOfURL:imageurl];

            dispatch_async(dispatch_get_main_queue(), ^
                [record setValue:[UIImage imageWithData:image] forKey:@"img"];

                [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
            );
        );
    

【讨论】:

【参考方案3】:

这条线很可能

[记录valueForKey:@"img"]

objectForKey: 将在未设置键 img 的情况下返回 nil。在您的情况下是更好的选择。

但是,请总体检查您的代码。您首先创建一个新的NSMutableDictionary 并将其分配给record。然后将一个字符串对象添加到该字典中。到目前为止还好。 之后,您也从分配给 record 的数组 _array 中获取一个对象。到那时,您不再对新创建的字典有任何引用。是不是故意的。如果您不使用 ARC,那么您会在此处创建内存泄漏。

编辑以回应以下评论:

NSMutableDictionary *record = [NSMutableDictionary dictionary]; // here you create a new empty instance of NSMutableDictionary and store it in record. It has a retain count of 1
[record setObject:str forKey:@"img"]; // here you add an object to that new dictionary. Now it has exactly one entry with the key "img"
record = [_array objectAtIndex:indexPath.row]; //and here you discard the retained newly creaded dictionary by assigning another one from the array _array. What is the purpose of that?

【讨论】:

是的,实际上我没有使用 ARC 并且它从上面引用。 查看我编辑的答案。它与您的原始问题无关,但您确实存在内存泄漏。【参考方案4】:

在您的 cmets 和答案的帮助下解决了问题。我所做的是在 Globally used 类中创建 NSMutable Dictionary 并初始化变量。谢谢大家的帮助

arr = [[NSMutableDictionary alloc] init];


dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,  0ul);
    if ([[[DataManager sharedInstance] arr] objectForKey:str]) 
        NSLog(@"in if");

         [cell m_img].image = [UIImage imageWithData:[[[DataManager sharedInstance] arr] objectForKey:str]]; 
     else 
        dispatch_async(queue, ^
             NSLog(@"in else");



                NSURL  *imageurl = [[NSURL alloc] initWithString:str];
                NSData *image = [[NSData alloc] initWithContentsOfURL:imageurl];
                [[[DataManager sharedInstance] arr] setObject :image forKey:str];
                [cell m_img].image = [UIImage imageWithData:[[[DataManager sharedInstance] arr] objectForKey:str]]; 

        );
    

【讨论】:

以上是关于由于未捕获的异常“NSUnknownKeyException”而终止应用程序此类不符合键 .img 的键值编码的主要内容,如果未能解决你的问题,请参考以下文章

由于未捕获的异常而终止应用程序 [UIImageView _isResizable]

由于未捕获的异常而终止应用程序,同时加载视图

由于未捕获的异常“NSInternalInconsistencyException”错误而终止应用程序

“由于未捕获的异常而终止应用程序”在推送视图控制器时崩溃

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,

由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序