if语句因Core Data托管对象的变量而失败

时间:2011-07-05 11:12:53

标签: objective-c ios core-data xcode4

我遇到了托管对象的问题......想象一下。

这是一个真正的doozy,也许有人可以提供帮助。

所以我有一个名为“Format”的托管对象类,它是一个实体。无论如何,它有一个名为“slot”的属性,它是一个NSNumber。现在数字的值可以从0到4,但是如果它没有值,那么我希望NSNumber对象等于“nil”而不是零。我没有任何运气,因为显然是零是和“无”相同。啊。 (有没有办法判断指针是否为空,“nil”,而不是指向零值?)

无论如何,我尝试了一种解决方法,即将变量渲染成文本:

if(@"myFormat.slot" != @"(null)")
    NSLog(@"slot==%@",myFormat.slot);

但问题是我在日志中得到了这个:

slot==(null)

所以,好吧......到底是什么?如果@“myFormat.slot”== @“(null)”那么,如果声明解决了,那该怎么回事......?!?!

我现在真的很困惑......请有人帮助我。

3 个答案:

答案 0 :(得分:0)

if(@"myFormat.slot" != @"(null)")始终为true,因为@"myString"会创建一个自动释放的字符串。因此,您正在检查不同自动释放字符串的地址,并且(惊讶)它们是不同的。

你有没有试过这样的事情:

if ([myNumber isEqualTo: [NSNumber numberWithInt: 0]]) self.myNumber = nil;

答案 1 :(得分:0)

比较2 NSString个对象的内容时,请使用isEqual:方法,或者,如果需要执行基于Unicode的字符串比较,请使用isEqualToString:

如果您想将myFormat.slot设置为nil,请执行以下操作:

myFormat.slot = nil;

要将slot属性的值设置为零:

myFormat.slot = [NSNumber numberWithInt:0];

要比较NSNumber中包含的值(例如,检查您的插槽是否等于0整数值),请执行以下操作:

if ([myFormat.slot intValue] == 0) { // primitive type comparison
    //... 
}

或者这个:

if ([myFormat.slot isEqual:[NSNumber numberWithInt:0]]) { // object comparison
    //... 
}

不是

if (myFormat.slot == 0) { // pointer comparison!! 
    //... 
}

检查slot是否为空(零):

if (myFormat.slot == nil) {
    //...
}

请记住:Core Data标准属性始终映射到非原始值(NSString,NSDate,NSNumber)。始终使用isEqual:compare:&朋友在比较对象的价值时。当您使用非基元时,==运算符执行指针比较。

答案 2 :(得分:0)

您永远不会从属性中获得nil。相反,您会得到一个[NSNull null]对象。

在Objective-C中,nilnull不可互换。当你看到nil时,你几乎看到了一个解除引用的指针。 nil旨在表明没有为该符号分配任何对象。相比之下,null[NSNull null]的单例实例。它用作占位符,表示尚未设置由对象表示的某些 。换句话说,值nil在Objective-C中没有意义。

在Core Data中,即使关系和属性都返回对象,它们也不会被视为相同。关系是指向外部对象的指针,因此如果在关系的另一侧没有设置任何对象,则可以返回nil。属性是仅由对象持有的 ,因此如果未设置,则始终由[NSNull null]表示。

默认情况下,具有数值的所有属性都将返回初始化为零的NSNumber对象。如果删除默认设置,则会获得[NSNull null]

但是,由于[NSNull null]是一个单例,你可以使用简单的指针比较来检查它,例如。

if (myMo.numericalAttribute == [NSNull null])...

然而,这被认为是不好的做法。