12

我有一个例外说:

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

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

4

3 回答 3

15

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

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

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

于 2013-03-06T01:29:05.380 回答
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
}

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

于 2013-03-06T01:24:23.240 回答
1

我建议向 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];

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

于 2016-07-21T20:19:01.647 回答