NSNumber原始值相等与使用Obj-C Literals的isEqualToNumber

时间:2013-02-14 20:09:31

标签: ios objective-c objective-c-literals

现在我们在Objective-C中有编译器支持的NSNumber文字,是否有一种比较NSNumber与已知整数值的首选方法?

旧的方式是 [myNumber integerValue] == 5

现在我们可以[myNumber isEqualToNumber:@5]甚至[myNumber isEqualToNumber:@(someVariable)]

isEqualToNumber:方法有优势,还是我们应该坚持使用integerValue,除非要比较的值已经是NSNumber?

我可以看到的一个优点是,如果someVariable从NSInteger变为CGFloat,则新方法不需要更改代码。

4 个答案:

答案 0 :(得分:10)

新方法实际上是围绕旧

的新语法
[myNumber isEqualToNumber:[NSNumber numberWithInt:5]]

需要额外拨打numberWithInt:;实际上,我们将一个解决方案与单个调度和零分配进行比较,并将解决方案与两个调度进行比较,并可能进行分配/解除分配。

如果你在紧密循环之外进行这种比较,那就不重要了。但如果你在一个非常紧凑的循环中进行,也许在绘制某些东西时,你可能会看到一个缓慢的下降。这就是为什么我会继续使用

的旧方法
[myNumber integerValue] == 5

答案 1 :(得分:3)

“旧方式”是一种方法调用加上两种基本类型的比较运算符。

“新方式”是一个方法调用加上额外的对象创建。

所以旧方法更有效率。但除非这是在高性能循环(或类似的东西)中完成的,否则差异可以忽略不计。

正如您所说,关于特定类型的数字,新方式可能更灵活。

就个人而言,除非您有明确且具体的性能问题需要处理,否则我会选择您认为更具可读性和可维护性的表单。

虽然您可能有特定的理由来比较浮点值或整数值,而不管原始值。在这种情况下,旧方法更好,因为比较的类型是明确的。

答案 2 :(得分:3)

简短回答: [myNumber integerValue] == 5仍然是最好的。

很长(但你可能不应该关心)回答:从iOS 5开始,“一些”NSNumbers是使用标记指针(quick google)实现的。这意味着只要NSNumber值适合24位(对于iPhone / iPad的32位ARM处理器),就不会创建实际的实例。所以从理论上讲,如果你确定这些值永远不会溢出24位,你实际上只能myNumber == @5

这不是一个好建议。坚持[myNumber integerValue] == 5。标记指针可以帮助运行时,而不是程序员。

答案 3 :(得分:0)

NSNumber *yourNumber = @(5)

yourNumber永远不应该为零时使用。 yourNumber变为零

时会崩溃
[myNumber isEqualToNumber:yourNumber] 

yourNumber可以为零时使用

myNumber.integerValue == yourNumber.integerValue

请注意,您必须知道yourNumber可以采用的最大值。

如果您的号码超过INT_MAX 2147483647,请使用longValuelonglongValue