【问题标题】:-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance-[NSNull objectForKeyedSubscript:]: 无法识别的选择器发送到实例
【发布时间】:2023-03-09 00:09:01
【问题描述】:

我得到了一个例外,上面写着:

-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance

是说我正在尝试使用密钥访问NSNull 对象吗? 知道是什么原因造成的,以及如何修复或进一步调试吗?

【问题讨论】:

  • 应该很容易找到。你在哪里下标?
  • 看起来你有一个 NSNull 你期待别的东西。一些代码可以帮助人们帮助你解决这个问题。
  • 修复它的方法是不要在 NSNull 对象上尝试 objectForKeyedSubscript。 (我打赌您正在处理一些 JSON 数据,并且没有准备好使用 NULL 值。)
  • (显然 objectForKeyedSubscript 是新的array[x] 符号转换成的内容。)
  • @HotLicks NSDictionary, NSArray- (id)objectAtIndexedSubscript:(NSUInteger)idx

标签: objective-c


【解决方案1】:

修复它的方法是不要在 NSNull 对象上尝试 objectForKeyedSubscript。 (我打赌你正在处理一些 JSON 数据,并且没有为 NULL 值做好准备。)

(显然 objectForKeyedSubscript 是新数组 [x] 符号转换成的内容。)

(请注意,您可以通过简单地将==[NSNull null] 进行比较来测试NSNull,因为应用程序中只有一个NSNull 对象。)

【讨论】:

  • 使用无效键访问字典会引发此异常吗?
  • @Boon No. 这将返回 nil,这与 NSNull 非常不同。
  • @Boon - 正如 Mike D 所说,在字典上使用无效键只会返回 nil - 也不例外。数组上的无效索引会引发异常,但它是 NSRangeException,而不是“无法识别的选择器”。但是请注意,如果您尝试“索引”一个 NSString、一个 NSView 或其他一些非数组/字典对象,您会得到“无法识别的选择器”——这是一个通用错误,意味着指定的类不支持指定的方法。
【解决方案2】:

不管编辑器告诉你什么,你存储的值是什么,在运行时你存储一个NSNull,然后尝试调用objectForKeyedSubscript。我猜这发生在预期的NSDictionary 上。比如:

NSString *str = dict[@"SomeKey"]

要么事先有一段代码没有完成它的工作并在那里进行调查,要么执行一些验证:

NSDictionary *dict = ...;

if ( [dict isKindOfClass:[NSDictionary class]] ) {
    // handle the dictionary
}
else {
   // some kind of error, handle appropriately
}

我在处理来自网络操作的错误消息时经常遇到这种情况。

【讨论】:

    【解决方案3】:

    我建议向 NSNull 添加一个类别来处理这个问题,就像你期望一个下标调用被发送到 nil 时一样。

    @implementation NSNull (Additions)
    
    - (NSObject*)objectForKeyedSubscript:(id<NSCopying>)key {
        return nil;
    }
    
    - (NSObject*)objectAtIndexedSubscript:(NSUInteger)idx {
        return nil;
    }
    
    @end
    

    一个简单的测试方法是这样的:

    id n = [NSNull null];
    n[@""];
    n[0];
    

    有了这个类别,这个测试应该可以成功/温和地处理。

    【讨论】:

      猜你喜欢
      • 2011-08-23
      • 1970-01-01
      • 2015-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-11
      • 2023-04-09
      • 2014-01-08
      相关资源
      最近更新 更多