我有一个例外说:
-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance
是说我正在尝试使用NSNull
密钥访问对象吗?知道是什么原因造成的以及如何修复它或进一步调试吗?
我有一个例外说:
-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance
是说我正在尝试使用NSNull
密钥访问对象吗?知道是什么原因造成的以及如何修复它或进一步调试吗?
修复它的方法是不要在 NSNull 对象上尝试 objectForKeyedSubscript。(我打赌你正在处理一些 JSON 数据并且没有准备好 NULL 值。)
(显然 objectForKeyedSubscript 是新的 array[x] 符号转换成的内容。)
(请注意,您可以通过简单地与==
to进行比较来测试 NSNull [NSNull null]
,因为应用程序中只有一个 NSNull 对象。)
不管编辑器告诉你什么,你存储的值是什么,在运行时你正在存储一个NSNull
,然后在尝试调用objectForKeyedSubscript
. 我猜这发生在预期的NSDictionary
. 就像是:
NSString *str = dict[@"SomeKey"]
事先一段代码没有完成它的工作并在那里进行调查,或者执行一些验证:
NSDictionary *dict = ...;
if ( [dict isKindOfClass:[NSDictionary class]] ) {
// handle the dictionary
}
else {
// some kind of error, handle appropriately
}
在处理来自网络操作的错误消息时,我经常遇到这种情况。
我建议向 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];
有了这个类别,这个测试应该被成功/温和地处理。