2012-01-31 71 views
4

我有這行代碼,我試圖找出我寫它的方式的利弊。我只是想設置一個標籤爲浮點值和兩個工作....只是不知道哪個好...的NSNumber numberWithFloat VS初始化或Alloc

self.display.text=[[NSNumber numberWithFloat:32.445] stringValue]; 

有什麼區別說

NSNumber *number = [[NSNumber alloc]initWithFloat:32.445]; 
self.display.text = [number stringValue]; 

好吧 - 我知道這一定是有區別的 - 只是不確定它會是什麼。看起來像第一個是更多的包裝(如果這是有道理的)?

謝謝!

回答

9

[NSNumber numberWithFloat:32.445] 

相當於:

[[[NSNumber alloc] initWithFloat:32.445] autorelease] 

在說明書參考計數模式。在ARC或GC模式下,你可以認爲它等同於:

[[NSNumber alloc] initWithFloat:32.445] 

唯一的好處你可能有可能得到是要儘量避免在MRC模式autorelease呼叫,並用電話release更換。

+0

他們可以實際行爲完全不同的練習 - 至少在32位目標上。我只是跑測試在Xcode 7.2.1,發現'+ numberWithFloat'和'@(N)'都在分配的對象必須在以後自動釋放,而如果你在一個大循環產生大量的這些,會浪費大量的內存(每個'unsigned long long int'大約20個字節)。相比之下,'+ alloc' /'+ init'使對象可以在最後一次使用後立即銷燬。奇怪的是,在64位目標,既不這三種替代的吞噬存儲器。我不知道爲什麼。 – 2016-03-11 00:46:00

+1

當然,如果你是在一個循環中,將自動釋放會殺了你的任何物體。性能和記憶明智。在64位,Foundation使用標記的指針(https://en.m.wikipedia.org/wiki/Tagged_pointer)一樣,因爲它可以爲NSNumbers以避免分配/解除分配。 – Julien 2016-03-16 00:45:02

1

numberWithFloat:選擇調用的NSNumber一個類的方法(很像從Java,C#或C++的靜態方法)。所述initWithFloat:選擇調用一個特定的NSNumber對象上的實例方法。您使用[NSNumber alloc]將實例獲取到init。

(見Apple's docs更多。)

這絕對公平地認爲靜態方法作爲第二種形式的包裝,因爲有人的地方,必須調用alloc

1

除非你正在運行ARC,你需要在後一種情況下[數字發行。用於一次性使用,然後,在前一種情況下 - 使用+ numberWithFloat: - 可能是優選的(較少打字=錯誤更少,更清晰的代碼)。

我能想到的唯一真正的區別是,如果您在特定性能關鍵型應用程序(特別是涉及到循環)中使用這些應用程序,則在決定是使用類還是實例方法時,存在更復雜的內存優化考慮因素。然而這些並不真正適用於此(想必這是UI代碼),所以只是讓你的生活簡單,使用+ numberWithFloat :.

0

使用alloc/initWithFloat方法,我相信'數字'將不得不放在某處。

2

看起來像第一個是更多的包裝(如果這是有道理的)?

也就是說正是它是什麼,在大多數實現的,並禁止角落案件= P這就是所謂的一個便捷構造。

至於你應該更喜歡什麼 - 什麼更清楚你。我更喜歡alloc + init,因爲它更容易管理內存,並且需要稍微更少的開銷(除了角落案例)。

如果你知道你有很多的對象進行或正在寫性能/內存的關鍵代碼(咳嗽 iOS設備),那麼你應該考慮有利於頁頭+初始化爲你的「重」的代碼。

1

如果你使用ARC工作,那麼我想這兩個方面是相同的。

如果你沒有工作ARC,最喜歡的OBJ-C開發人員已經通過,那麼你的第二個片段泄漏內存,你可以考慮寫這樣的:

NSNumber *number = [[[NSNumber alloc]initWithFloat:32.445] autorelease];