在空的NSDictionary上调用valueForKey

时间:2013-02-10 00:17:09

标签: objective-c cocoa nsstring nsdictionary

在我的代码中,我在一个空的valueForKey对象上调用NSDictionary,并注意到应用程序确实崩溃了。但据我所知,如果将消息发送到空对象,应用程序将不会崩溃。有人能帮我解释这里的矛盾吗?非常感谢你。

这是我的代码:

if ([[storedManagedObject valueForKey:@"objectId"] isEqualToString:[record valueForKey:@"objectId"]]) {
    [self updateManagedObject:[storedRecords objectAtIndex:currentIndex] withRecord:record];
} else {
    [self newManagedObjectWithClassName:className forRecord:record];
}

在某些情况下,storedManagedObject对象为零。

1 个答案:

答案 0 :(得分:1)

您的崩溃正在发生,因为isEqualToString在比较之前对值进行类型检查。如果您只使用isEqual,传递nil参数时的行为将更像您期望的那样:

if ([[storedManagedObject valueForKey:@"objectId"] isEqual:[record valueForKey:@"objectId"]]) {

请参阅Cocoa documentation

  

在Cocoa框架的所有isEqualToType:方法中,nil不是   这些方法的有效参数和实现可能会引发一个问题   收到nil后的例外情况。但是,为了向后兼容,   Cocoa框架的isEqual:方法接受nil,返回NO