簡體   English   中英

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

[英]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 ,使用longValuelonglongValue

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM