【问题标题】:if statement fails with variable from CoreData managed objectif 语句因 CoreData 托管对象中的变量而失败
【发布时间】:2011-07-05 11:12:52
【问题描述】:

我在使用托管对象时遇到了一些问题......想象一下。

这是一个真正的笨蛋,也许有人可以帮忙。

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

无论如何,我尝试了一种解决方法,将变量呈现为如下文本:

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

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

slot==(null)

那么,好吧……到底是什么?如果 @"myFormat.slot" == @"(null)" 那么 if 语句到底是怎么解决的......?!?!

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

【问题讨论】:

  • 好吧,我真的很累。显然@"myformat.slot" 是错的,需要@"%@",myformat.slot... 唉。但如果可能的话,我仍然希望回答第一个问题。 (有没有办法判断指针是否为空,“nil”,而不是指向零值?)
  • 好吧,回到第一方...因为:
  • NSString *asdf = [NSString stringWithFormat:@"slot==%@",myFormat.slot]; NSLog(asdf); if(asdf != @"slot==(null)") { NSLog(@"slot==%@",myFormat.slot);
  • 导致同样的问题。控制台上有两个 slot==(null)。

标签: objective-c ios core-data xcode4


【解决方案1】:

你永远不会从属性中得到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])...

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      myFormat.slot = nil;
      

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

      myFormat.slot = [NSNumber numberWithInt:0];
      

      要比较包装在NSNumbers 中的值(例如检查您的槽是否等于 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是否为空(nil):

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-03
        • 2018-02-02
        • 2019-01-26
        • 2013-01-15
        • 2021-10-17
        • 2015-02-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多