5

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

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

我正在将核心数据(整数 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。

有任何想法吗?

4

3 回答 3

11

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

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

的实现isEqualToNumber:可能采用包装的值类型并比较它们。

于 2011-03-24T06:16:12.937 回答
2

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

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

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

希望这可以帮助... : )

于 2011-03-24T06:16:25.850 回答
1

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

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

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

于 2012-02-10T08:32:23.027 回答