现在我们在Objective-C中有编译器支持的NSNumber文字,是否有一种比较NSNumber与已知整数值的首选方法?
旧的方式是
[myNumber integerValue] == 5
现在我们可以[myNumber isEqualToNumber:@5]
甚至[myNumber isEqualToNumber:@(someVariable)]
。
isEqualToNumber:
方法有优势,还是我们应该坚持使用integerValue,除非要比较的值已经是NSNumber?
我可以看到的一个优点是,如果someVariable从NSInteger变为CGFloat,则新方法不需要更改代码。
答案 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
,请使用longValue
或longlongValue