2011-11-09 48 views

回答

4

當你不得不處理數字而不是短計算時,總是使用NSNumber來節省時間和精力?

好,NSNumber一般要經過分配和引用計數箍打造,讓時間比創建堆棧上的浮動長得多。

同樣,NSNumber是一個不可變的類型,所以經常設置它並沒有太大意義,因爲每次更改時都必須分配一個新實例。他們做了一些優化,但相對於在堆棧上創建一個浮點數仍然是一個巨大的開銷。比其他方式更經常地使用內建腳本的內存也會少於NSNumber

什麼是最好的方法?

我只是使用內建(例如floatint),除非我需要一個NSNumberDetails and rationale here

+2

是的,但OP詢問'NSInteger'和'CGFloat'也是... NSInteger在64位體系結構上32位和長整型被定義爲int。 CGFloat在32位上被定義爲「float」,在64位上被定義爲「double」。因此,使用'CGFloat'和'NSInteger'的優點是,您可以自動獲得每個平臺的最佳精度。 (iOS目前是32位,雖然支持雙精度[速度較慢](http://stackoverflow.com/a/1622786/172218))。如果您需要固定的整數精度,則最好使用[stdint.h](http://en.wikipedia.org/wiki/Stdint)中的類型「uint16_t」。 –

+0

@JamieBullock多謝+1 – justin

1

使用任何適合您的任務

例如,如果您正在計算繪圖使用CGFloat的rects,因爲這是rects的用法。

另一方面,NSNumber對於需要多個數字表示(即需要使用浮點數和整數)的情況非常有用。

+0

OK的時間顯著的損失,但是想象一下,我需要存儲浮球(用於rects)。是否最好使用NSNumber並在需要時將其轉換爲CGFloat,或者使用CGFloat並在存儲在plist中時將其轉換爲NSNumber? – Oliver

+1

在這種情況下,我會將其存儲爲NSNumber。你如何使用NSNumber取決於你的代碼,但作爲一般經驗法則,我不喜歡做很多[myNumber floatValue],所以我可能會從[myNumber floatValue]中創建一個CGFloat變量,然後在方法。使用最適合你的方式(考慮可讀性,可維護性等)。在性能方面,它不可能有任何區別(如果你懷疑它確實存在的話),所以它可以歸結爲偏好。 – sosborn

1

NSInteger,NSUInteger,CGFloat等是簡單的類型,並對應於int,unsigned int和float。 NSNumber是Objective-C類,NSValue的子類具體。您可以從有符號或無符號字符,short int,int,long int,long long int,float,double或BOOL創建一個NSNumber對象。
其中一個主要的區別是,您可以在需要對象的集合(如NSArray)中使用NSNumberNSInteger是一個簡單的整數,NSNumber是一個對象。
出於性能原因,如果可以的話,使用原始類型(如int,float)。但是,有時候您無法避免使用NSNumber,

0

使用NSInteger & CGFloat允許您的代碼在所有體系結構(32/64位)上正常運行。如果您使用int/float並編譯了64位體系結構的代碼,則它可能無法在32位系統上正常運行。此外,如果Apple發佈了128位系統,您的NSInteger/CGFloat代碼仍然可以在那裏工作(假設Apple更新了NSInteger & CGFloat的定義,他們可能會這樣做)。

是的,它總是使用的NSNumber

+0

「如果你使用int/float併爲64位體系結構編譯你的代碼,它將不會在32位系統上運行。」:代碼將運行。您可能會收到警告甚至不想要的行爲,但它會運行。 – chr

+0

偉大的觀點,謝謝!上面編輯的答案。 – kcwaverider

相關問題