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

Ale*_*lav 5 objective-c ios objective-c-literals

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

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

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

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

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

das*_*ght 10

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

[myNumber isEqualToNumber:[NSNumber numberWithInt:5]]
Run Code Online (Sandbox Code Playgroud)

这需要额外的电话numberWithInt:; 实质上,我们将一个解决方案与单个调度和零分配进行比较,并将解决方案与两个调度进行比较,并可能进行分配/解除分配.

如果你在紧密循环之外进行这种比较,那就无所谓了.但如果你在一个非常紧凑的循环中进行,也许在绘制某些东西时,你可能会看到一个缓慢的下降.这就是为什么我会坚持旧的方法

[myNumber integerValue] == 5
Run Code Online (Sandbox Code Playgroud)