我还有一个关于检查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'
这让我发疯了......
答案 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。