【问题标题】:Compare NSNumber with NSInteger比较 NSNumber 和 NSInteger
【发布时间】:2011-03-24 06:11:33
【问题描述】:

我今天花了一些时间追查两个错误,并最终使用相同的解决方案修复了这两个错误。

现在我有了解决方案,我希望能弄清楚它的背后。

我正在将 Core Data (Integer 16/NSNumber) 中的一个属性与一个整数 (ABPropertyID & ABMultiValueIdentifier) 进行比较。

这个错误就在这个比较中,而且奇怪的是,只有在我(从后台托盘)杀死应用程序、重新打开它并运行包含比较的相同过程后才出现。总之……

这是重启后停止工作的原因:

if (myNumber.aProperty == [NSNUmber numberWithInt:anInteger]) { /* do stuff here */ }

这是目前为止运行良好的两种解决方案:

if ([myNumber.aProperty integerValue] == anInteger) {/* do stuff here */ }

if ([myNumber.aProperty isEqualToNumber:[NSNumber numberWithInt:anInteger]]) { /* do stuff here */ }

对我来说,它们看起来都一样。我总是要么将 NSNumber 转换为 integerValue,要么将整数转换为 NSNumber。

有什么想法吗?

【问题讨论】:

    标签: iphone objective-c ios nsnumber nsinteger


    【解决方案1】:

    不要使用== 来比较NSNumbers。大多数情况下,您将比较两个不同的对象,因此比较不会评估为真。如果您查看 if 条件,请注意您特别将您的属性与 全新 NSNumber 对象进行比较。

    由于 NSInteger 是某些值类型的 Cocoa 包装器,因此将 NSIntegers 与 == 进行比较可以正常工作。

    isEqualToNumber: 的实现可能会采用包装的值类型并对其进行比较。

    【讨论】:

    • 这是有道理的。一件奇怪的事情,在我的帖子中简要提到,当我第一次运行我的应用程序时,这种比较实际上是有效的。只有在我杀死我的应用程序、重新打开它并通过比较运行应用程序之后,我才开始看到意想不到的结果。在不了解我的应用程序或查看任何代码的情况下,您会猜测为什么会发生这种情况吗?
    • @djibouti33:没有线索......(我这么说也是在指出它的不可预测性:)
    【解决方案2】:

    正如你所说,两种解决方案都有效...

    我更喜欢第一个,因为它看起来更具可读性,恕我直言...... 在将 NSNumber 转换为 int 之后,当您比较整数时,它也可能更高效。

    在第二个中,将 int 转换为对象,然后比较两个对象... 所以这是第二个方法调用,在第一种情况下你没有......

    希望这会有所帮助... :)

    【讨论】:

      【解决方案3】:

      netWorkingButtonsIndexes 是包含对象的数组,并且 LinkedIn 是一个具有int 数据类型的数字。

      [[netWorkingButtonsIndexes objectAtIndex:buttonIndex] isEqual:[NSNumber numberWithInteger:LinkedIn]] 
      

      通过使用isEqual 方法,我们可以将对象与任何数据类型进行比较。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多