- [NSNull objectForKeyedSubscript:]:发送到实例的无法识别的选择器

时间:2013-03-06 01:09:54

标签: objective-c

我有一个例外,说:

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

它是说我试图用密钥访问NSNull对象吗? 知道导致这种情况的原因以及如何解决或进一步调试?

3 个答案:

答案 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];

使用此类别,应成功/轻柔地处理此测试。