我有一个例外,说:
-[NSNull objectForKeyedSubscript:]: unrecognized selector sent to instance
它是说我试图用密钥访问NSNull
对象吗?
知道导致这种情况的原因以及如何解决或进一步调试?
答案 0 :(得分:14)
修复它的方法是不在NSNull对象上尝试objectForKeyedSubscript。 (我打赌你正在处理一些JSON数据,并且没有为NULL值做好准备。)
(显然,objectForKeyedSubscript是新数组[x]符号转换成的内容。)
(请注意,您只需将==
与[NSNull null]
进行比较即可测试NSNull,因为应用中只有一个NSNull对象。)
答案 1 :(得分: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
}
在处理来自网络操作的错误消息时,我经常遇到这种情况。
答案 2 :(得分: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];
使用此类别,应成功/轻柔地处理此测试。