将NSNumber与NSInteger进行比较

5

今天我花了一些时间追踪两个错误,并最终用相同的解决方案解决了它们。

既然我有了解决方案,希望能得到一些清晰的理解。

我正在将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,要么将integer转换为NSNumber。

有任何想法吗?

3个回答

11

不要使用==比较NSNumber。大多数情况下,你将比较两个不同的对象,因此比较结果将不为真。如果你查看if条件语句,请注意你特别地比较了你的属性和一个全新的NSNumber对象。

由于NSInteger是某些值类型的Cocoa包装器,所以使用==比较NSInteger是没问题的。

isEqualToNumber:的实现可能会取出封装的值类型并进行比较。


1
这很有道理。不过有一件事情很奇怪,我在帖子中简要提到了,就是当我第一次运行我的应用程序时,比较实际上是有效的。只有在我杀死应用程序、重新打开它并通过比较运行应用程序后,我才开始看到意外的结果。如果您不知道我的应用程序或没有看到任何代码,您会猜测为什么会发生这种情况吗? - djibouti33
@djibouti33:一点头绪也没有...(我这么说是想指出它的不可预测性 :)) - BoltClock

2

正如你所说,两种解决方案都可以工作...

我更喜欢第一种方法,因为它看起来更易读... 它也可能更高效,因为你在将NSNumber转换为int后比较整数。

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

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


1

netWorkingButtonsIndexes 是一个包含对象的数组,而 LinkedIn 是一个 int 数据类型的数字。

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

通过使用 isEqual 方法,我们可以比较具有任何数据类型的对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接