2009-08-24 30 views
0

我有一个CoreData实体(航点)带有到另一个实体(轨道)的外键。当外键设置,或者如果没有设置它,这个if语句正常工作:CoreData:正在检查

if ([wp track]) { 
    thirdLabel.text = [NSString stringWithFormat:@"Part of Track: %@", [[wp track] title]]; 
} 

但是,如果已被删除的航点被键入轨道,然后按[WP轨道]仍计算为true,并且当我设置标签文本时程序崩溃。

那么,我该如何正确检查CoreData中这个“已被删除”的空值?

回答

6

这听起来像你有一个单向关系的问题。您正在描述的问题在“单向关系”下更详细地给出here

基本上,您的航点无法知道该轨道已从其下删除。建议的解决方案是将关系建模为双向,这使Core Data能够保持模型的一致性。

在您的具体示例中,如果您的'track'对象与'waypoint'有反向关系,那么当您删除'track'对象时,Core Data将知道更新航点以摆脱任何悬挂关系。更多关于这点的信息也可以在上面的链接中看到。

0

有效的Objective-C发送消息到nil。你需要修改,如果谓语阅读:

if (wp != nil && [wp track]) { 
    //... 
} 

您还可以检查对象,当对象已释放可能的情况下返回0或崩溃的retainCount

在这两种情况下,它可能是最好从任何人破坏wp于那些热衷于使用它,或者至少保留wp,直到你在这个代码用它做后发出某种形式的通知。

+1

这不会改变当前的行为,因为发送消息到nil返回nil,这将会导致'if'条件失败。 – bobDevil 2009-08-24 22:54:09