【问题标题】:Why getting error: class is not key value coding-compliant for the key name?为什么会出现错误:类与键名的键值编码不兼容?
【发布时间】:2020-03-29 15:58:14
【问题描述】:

正如 Xcode 自动完成建议中所建议的,在目标 c 中使用以下代码会产生运行时错误,

for (int i = 1; i <= 10; i++)
{
    NSLog(@"%d", i);

    NSDictionary *dic = [[NSDictionary alloc] init];
    [dic setValue:@"Alex" forKey:@"name"];
    [dic setValue:@"45" forKey:@"Age"];
}

2020-03-29 21:55:34.588607+0600 测试[5299:15492347] *** 终止 应用程序由于未捕获的异常“NSUnknownKeyException”,原因: '[<__nsdictionary0> setValue:forUndefinedKey:]: 这个 类与键名的键值编码不兼容。'

我错过了什么?

更新

正如matt 所评论的NSDictionary 是不可变的,那么,

  1. 为什么 setValue 方法可用于 Xcode 上自动完成建议中的 NSDictionary?

  2. 为什么不能在编译时而不是运行时检测到修改非可变集合的方法?

【问题讨论】:

  • “我错过了什么?”一切。 NSDictionary 是不可变的。你不能在里面设置任何东西。此外,setValue 是错误的机制。基本上,该代码的任何内容都是正确的。
  • 是KVC。这里不需要 KVC。只需致电setObject。当然,你不能,因为这不是一个可变字典。但这就是重点。
  • "NSDictionary 是不可变的,那为什么 NSDictionary 可以使用 setValue 方法" 因为它是 NSObject 上的一个类别。所有类都继承它。但这并不意味着您可以使用它来尝试解决类不可变的事实。所有类都继承copy,但并非所有类都符合 NSCopying。以此类推。
  • 确实删除了它。这就是异常告诉你的。
  • 因为它是一个NSObject方法。

标签: ios objective-c runtime-error nsdictionary


【解决方案1】:

我通过将setValue 更改为setObject 来解决此问题,

NSDictionary *dic = [[NSDictionary alloc] init];
[dic setObject:@"Alex" forKey:@"name"];
[dic setObject:@"45" forKey:@"Age"];

【讨论】:

    猜你喜欢
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2012-08-18
    • 2013-10-11
    • 2014-05-17
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    相关资源
    最近更新 更多