iOS如何检查valueForKey是否存在?

时间:2015-05-15 13:55:35

标签: ios objective-c

我还有一个关于检查valueForKey是否存在的问题。 这是我的代码:

id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];
Monday = [[NSMutableArray alloc] init];
if ([_jsonId valueForKey:@"Mon"]!= Nil) {
    _keyMon = [_jsonId valueForKey:@"Mon"];
    [Monday addObject:@"Monday"];
    for (int i=0; i<5; i++) {
        if ([_keyMon objectAtIndex:i]!=[NSNull null]) {

            [Monday addObject:[_keyMon objectAtIndex:i]];
        }
    }

} else {
    [_keyTues addObject:@"No Class For Today"];
    [Monday addObject:[_keyMon objectAtIndex:1]];
}

这个想法是,如果_jsonId valueForKey没有回来,我可以添加这个NSString addObject:@"No Class For Today,XCode告诉我:  *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

就像它现在告诉我的那样。有人有任何解决方案? 我试过if ([_jsonId valueForKey:@"Mon"]!= Nil)没有用。 我试过if ([_jsonId valueForKey:@"Mon"]!= nil)没有用。 我试过if ([_jsonId valueForKey:@"Mon"]!= (id)[NSNull null])没有用。 我试过if ([_jsonId valueForKey:@"Mon"]!= [NSNull null)没有用。

我知道_jsonId valueForKey作为指针返回,但我不知道如何检查指针是否为空(如果我是正确的话,在Objective-C中为nil)。请帮帮我。

更新 我试过使用objectForKey,这里是一个代码(_jsonId objectForKey是nil,我知道尝试测试代码)

if (_jsonId[@"Sun"]== nil) {
    [_keySun addObject:@"No Class For Today"];
    [Monday addObject:[_keySun objectAtIndex:1]];
            }
else{
   _keySun = [_jsonId objectForKey:@"Sun"];
   [Monday addObject:@"Sunday"];
   for (int i=0; i<5; i++) {
       if ([_keySun objectAtIndex:i]!=nil) {

           [Monday addObject:[_keySun objectAtIndex:i]];
       }
}
}

然而,XCode告诉我,我在NSArray中添加了一个零。

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSArrayM insertObject:atIndex:]: object cannot be nil'

这让我发疯了......

2 个答案:

答案 0 :(得分:2)

_jsonId定义如下:

id _jsonId = [NSJSONSerialization JSONObjectWithData:[_json dataUsingEncoding:NSUTF8StringEncoding] options:0 error:&_error];

...将是数组或字典。根据你的代码,我认为你假设它总是一本字典。所以你可能想补充一下:

if (![_jsonId isKindOfClass:[NSDictionary class]]) ...

然后你想知道字典里有什么,如果有的话。所以使用objectForKey:。或者,更好的是_jsonId[@"Mon"]。你会得到一个对象,或者你会得到nil

valueForKey:是一种完全不同的机制,键值编码。它在NSObject上定义,由NSDictionary继承,以及其他所有内容。它被定义为引发未知密钥的异常。由于它引发异常而不是返回结果,因此您尝试比较结果是无效的。

答案 1 :(得分:1)

我想我明白了。我们来看看代码:

if (_jsonId[@"Sun"]== nil) {
    [_keySun addObject:@"No Class For Today"];
    [Monday addObject:[_keySun objectAtIndex:1]];
}
else {
   _keySun = [_jsonId objectForKey:@"Sun"];
    ...

如果存在“Sun”键的对象,则将其存储到_keySun中。如果没有对象,则不在_keySun中存储任何内容。 _keySun将是零。您向_keySun发送addObject消息 - 但发送到nil对象的任何消息都不执行任何操作。然后调用[_keySun objectAtIndex:1]。同样,向nil对象发送消息不会做任何事情,并返回nil,这就是为什么你将nil添加到Monday对象并导致崩溃的原因。

如果您将_keySun设置为空的NSMutableArray,则会因为其他原因而崩溃:您尝试添加一个对象。您可以使用objectAtIndex:0读取该对象。但要读取objectAtIndex:1,您需要在数组中使用两个对象。

顺便说一句。如果您正在读取的JSON文档包含显式null,则将从JSON解析器获取[NSNull null]。因此,如果您的JSON包含“Sun”:null则为objectForKey:@“Sun”将给出[NSNull null]。如果您的JSON根本不包含密钥“Sun”,则objectForKey:@“Sun”将为nil。