我遇到了托管对象的问题......想象一下。
这是一个真正的doozy,也许有人可以提供帮助。
所以我有一个名为“Format”的托管对象类,它是一个实体。无论如何,它有一个名为“slot”的属性,它是一个NSNumber。现在数字的值可以从0到4,但是如果它没有值,那么我希望NSNumber对象等于“nil”而不是零。我没有任何运气,因为显然是零是和“无”相同。啊。 (有没有办法判断指针是否为空,“nil”,而不是指向零值?)
无论如何,我尝试了一种解决方法,即将变量渲染成文本:
if(@"myFormat.slot" != @"(null)")
NSLog(@"slot==%@",myFormat.slot);
但问题是我在日志中得到了这个:
slot==(null)
所以,好吧......到底是什么?如果@“myFormat.slot”== @“(null)”那么,如果声明解决了,那该怎么回事......?!?!
我现在真的很困惑......请有人帮助我。
答案 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中,nil
和null
不可互换。当你看到nil
时,你几乎看到了一个解除引用的指针。 nil
旨在表明没有为该符号分配任何对象。相比之下,null
是[NSNull null]
的单例实例。它用作占位符,表示尚未设置由对象表示的某些 值 。换句话说,值nil
在Objective-C中没有意义。
在Core Data中,即使关系和属性都返回对象,它们也不会被视为相同。关系是指向外部对象的指针,因此如果在关系的另一侧没有设置任何对象,则可以返回nil
。属性是仅由对象持有的 值 ,因此如果未设置,则始终由[NSNull null]
表示。
默认情况下,具有数值的所有属性都将返回初始化为零的NSNumber对象。如果删除默认设置,则会获得[NSNull null]
。
但是,由于[NSNull null]
是一个单例,你可以使用简单的指针比较来检查它,例如。
if (myMo.numericalAttribute == [NSNull null])...
然而,这被认为是不好的做法。