如果语句失败与CoreData托pipe对象的variables

我在pipe理对象方面遇到了一些麻烦…想象一下。

这是一个真正的愚蠢,也许有人可以帮助。

所以我有一个名为“Format”的pipe理对象类,它是一个实体。 无论如何,它有一个名为“槽”属性是一个NSNumber。 现在数字可以有从零到四的值,但是如果它没有值,那么我希望NSNumber对象等于“零”而不是零。 我没有什么运气,因为显然是零,就像“零”一样。 啊。 (有没有办法告诉指针是否只是空的,“零”,而不是指向一个零值?)

无论如何,我尝试了一个解决方法,就是将variables显示为文本,如下所示:

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

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

 slot==(null) 

所以,好吧…什么? 如果@“myFormat.slot”== @“(null)”,那么,如果语句parsing…?!?!

我现在真的很困惑…请别人帮我。

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

在Objective-C中, nilnull是不可互换的。 当你看到nil你几乎看着一个取消引用的指针。 nil旨在表示没有对象被分配给符号。 相反, null[NSNull null]的单例实例。 它被用作一个占位符来表示某个对象表示的没有被设置。 换句话说,在Objective-C中, nil值是没有意义的。

在Core Data中,即使关系和属性都返回对象,它们的处理方式也不尽相同。 关系是指向外部对象的指针,因此如果在关系的另一侧没有设置对象,则返回nil 。 一个属性是一个只有一个对象才能拥有的 ,因此如果没有设置,它总是由[NSNull null]表示。

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

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

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

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

这个if(@"myFormat.slot" != @"(null)")总是为真,因为@"myString"创build一个自动释放的string。 因此,你正在检查不同的自动释放string的地址,(惊喜)他们是不同的。

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

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

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

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

 myFormat.slot = nil; 

要将slot属性的值设置为零,请执行以下操作:

 myFormat.slot = [NSNumber numberWithInt:0]; 

要比较包含在NSNumber s中的值(例如,检查您的插槽是否等于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) { //... } 

请记住:核心数据标准属性总是映射到非原始值(NSString,NSDate,NSNumber)。 在比较对象的值时总是使用isEqual:compare:和friends。 ==运算符在与非基元一起使用时执行指针比较。