【问题标题】:Call valueForKey on an empty NSDictionary在空的 NSDictionary 上调用 valueForKey
【发布时间】:2013-02-10 00:17:09
【问题描述】:

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

这是我的代码:

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

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

【问题讨论】:

    标签: objective-c cocoa nsstring nsdictionary


    【解决方案1】:

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

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

    Cocoa documentation:

    在 Cocoa 框架的所有 isEqualToType: 方法中,nil 不是 这些方法的有效参数和实现可能会引发 收到nil 时出现异常。但是,为了向后兼容, Cocoa 框架的isEqual: 方法确实接受nil,返回NO

    【讨论】:

    • 感谢您的回复,但是在我的代码中,当storedManagedObject 为null 时,应用程序不会崩溃。当storedManagedObject为空时,它只是跳转执行else条件的代码。
    • 这正是我所期望的。向 nil 发送任何消息只会返回 nil 而不会崩溃。实际上,根据您提供的代码,当[record valueForKey:@"objectId"] 返回 nil 时会发生崩溃。调用isEqualToString:nil崩溃。
    • 您好,感谢您的解释。我现在对此更清楚了。以前,我认为释放的对象和 nil 是一回事,但现在我知道 nil 指向内存中预定义的空间。 PS:我试过调用 isEqualToString:nil 不会使应用程序崩溃。我认为只有调用 isEqualToString: 的已释放对象才会导致崩溃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-28
    • 2016-10-26
    相关资源
    最近更新 更多