[英]NSNumber primitive value equality vs isEqualToNumber with Obj-C Literals
既然我們在Objective-C中有編譯器支持的NSNumber文字,是否有一種比較NSNumber與已知整數值的首選方法?
舊方法是[myNumber integerValue] == 5
現在我們可以[myNumber isEqualToNumber:@5]
甚至[myNumber isEqualToNumber:@(someVariable)]
。
isEqualToNumber:
方法是否有優勢,或者我們應該堅持使用integerValue,除非要比較的值已經是NSNumber?
我可以看到的一個優點是,如果someVariable從NSInteger變為CGFloat,則新方法不需要更改代碼。
新的方式實際上是舊的語法
[myNumber isEqualToNumber:[NSNumber numberWithInt:5]]
這需要額外調用numberWithInt:
; 實質上,我們將一個解決方案與單個調度和零分配進行比較,並將解決方案與兩個調度進行比較,並可能進行分配/解除分配。
如果你在緊密循環之外進行這種比較,那就無所謂了。 但如果你在一個非常緊湊的循環中進行,也許在繪制某些東西時,你可能會看到一個緩慢的下降。 這就是為什么我會堅持舊的方法
[myNumber integerValue] == 5
“舊方法”是一種方法調用加上兩種基本類型的比較運算符。
“新方法”是一種方法調用加上額外的對象創建。
所以舊方法更有效率。 但除非這是在高性能循環(或類似的東西)中完成的,否則差異可以忽略不計。
如您所述,就特定類型的數字而言,新方式可能更靈活。
就個人而言,除非您有明確且具體的性能問題需要處理,否則我會選擇您認為更具可讀性和可維護性的表單。
雖然您可能有特定的理由來比較浮點值或整數值,而不管原始值。 在這種情況下,舊方法更好,因為比較的類型是明確的。
簡答: [myNumber integerValue] == 5
仍然是最好的。
很長(但你可能不應該關心)回答:從iOS 5開始,“一些”NSNumbers使用標記指針( 快速谷歌 )實現。 這意味着只要NSNumber值適合24位(對於iPhone / iPad的32位ARM處理器),就不會創建實際的實例。 所以從理論上講,如果你確定這些值永遠不會溢出24位,你實際上可以只做myNumber == @5
。
這不是一個好建議。 堅持[myNumber integerValue] == 5
。 標記指針可以幫助運行時,而不是程序員。
NSNumber *yourNumber = @(5)
當yourNumber
永遠不應該為零時使用。 當yourNumber
變為yourNumber
它會崩潰
[myNumber isEqualToNumber:yourNumber]
當yourNumber
可以為零時使用
myNumber.integerValue == yourNumber.integerValue
請注意,您必須知道yourNumber可以采用的最大值。
如果yourNumber將超過INT_MAX 2147483647
,使用longValue
或longlongValue
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.