将NSNumber与NSInteger进行比较

时间:2011-03-24 06:11:33

标签: iphone objective-c ios nsnumber nsinteger

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

现在我已经有了解决方案,我希望能够明白这一点。

我正在将Core Data(Integer 16 / NSNumber)的属性与Integer(ABPropertyID& ABM​​ultiValueIdentifier)进行比较。

这个比较中的错误,奇怪的是,只有在我杀死应用程序(从后台托盘),重新打开它并运行包括比较的相同过程后才显示自己。反正...

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

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。

有什么想法吗?

3 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:2)

正如你所说,两种解决方案都在运作......

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

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

希望这有助于......:)

答案 2 :(得分:1)

netWorkingButtonsIndexes是保存对象的数组 LinkedIn是一个int数据类型的数字。

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

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