7

既然我们在 Objective-C 中有了带有编译器支持的 NSNumber 字面量,有没有一种首选的方法可以将 NSNumber 与已知整数值进行比较?

老办法是 [myNumber integerValue] == 5

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

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

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

4

4 回答 4

11

新方式实际上是围绕旧的新语法

[myNumber isEqualToNumber:[NSNumber numberWithInt:5]]

这需要额外调用numberWithInt:; 本质上,我们正在将具有单个调度和零分配的解决方案与具有两个调度的解决方案进行比较,并且可能是分配/解除分配。

如果您在紧密循环之外进行此比较,则无关紧要。但是如果你在一个非常紧密的循环中进行,也许在绘制某些东西时,你可能会看到速度变慢。这就是为什么我会继续使用旧方法

[myNumber integerValue] == 5
于 2013-02-14T20:13:30.493 回答
3

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

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

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

正如您所说,新方法在特定类型的号码方面可能更加灵活。

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

尽管您可能有特定的原因来比较浮点值或整数值,而不管原始值。在这种情况下,旧方法更好,因为比较的类型很清楚。

于 2013-02-14T20:13:50.287 回答
3

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

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

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

于 2013-02-15T00:49:04.010 回答
0
NSNumber *yourNumber = @(5)

使用 whenyourNumber不应该是 nil。yourNumber变为 nil时会崩溃

[myNumber isEqualToNumber:yourNumber] 

使用whenyourNumber可以为nil

myNumber.integerValue == yourNumber.integerValue

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

如果 yourNumber 将超过INT_MAX 2147483647,请使用longValuelonglongValue

于 2018-04-09T18:18:04.987 回答