0

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

这是我的代码:

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

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

4

1 回答 1

1

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

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

请参阅Cocoa 文档

isEqualToType:在Cocoa 框架的所有方法中,nil不是有效参数,并且这些方法的实现可能会在接收到nil. 但是,为了向后兼容, isEqual:Cocoa 框架的方法确实接受nil,返回NO

于 2013-02-10T00:32:11.563 回答