2009-08-16 28 views

回答

50

現有答案很有用;增加對他們說:

是,NSUInteger給出正整數作爲NSInteger中兩次的範圍內,但我認爲選擇的另一個重要原因,兩者之間是簡單的情況下其中負數值根本就沒有意義之間進行區分。

實施例:NSArraycount方法的返回值是一個NSUInteger,這是有意義的,因爲我們可以不具有與元件的負數的陣列。當編碼者知道它沒有簽名時,他/她有更多的自由來執行在簽名情況下可能不可靠的操作,包括按位操作,如移位。 This blog post更多關於簽名和未簽名的內容。

我猜大約CGFloat VS NSFloat(不存在):這可能是在NeXTStep的命名代碼元素的設計者根本沒有需要指定太多的浮動值,以外的時間的情況下間隔。所以他們給出了NSTimeInterval,這是一個浮點類型,但是它明確地用於時間間隔。坦率地說,擁有這種類型是件好事,因爲你知道它總是意味着在幾秒鐘內不需要處理結構。當你進入圖形世界(Core Graphics居住的地方)時,突然浮在身邊,徘徊在空中(哈哈)。因此,在那裏引入CGFloat是有道理的。這一段全是「受過教育的投機」。

而且,僅僅是明確約爲什麼你可能使用NSInteger等,而不是原始類型的:因爲這種方式更容易編寫可移植的代碼,是以機器架構的優勢。例如,CGFloat在某些機器上使用32位,在其他機器上使用64位,這在很大程度上取決於這些機器上這些尺寸的效率差距。在某些情況下,使用32位和64位沒有真正的加速,所以你不妨使用64位。如果你已經聲明瞭CGFloat的東西,那麼當你重新編譯時,你會突然獲得「免費」的額外精度。

而且,正如iKenndac指出,NSNumber是這些所有一個包裝類(和其他原始或半原始類型,如BOOL),它使您可以包括在您的NSArray S和NSDictionary S,將它們更容易歸檔,並執行其他可以執行的操作。

+0

一個真正的非常難點: NSTimeinterval是一個雙重的,而不是一個浮動。我知道double是雙精度浮點的縮寫,但仍然是。 此外,我明白CGFloat編譯爲64位雙精度很好,但NSInteger?我想不出有什麼用處。在代碼中說你正在做一些需要64位的數學......如果你編譯爲32,你不能使用NSInteger。如果你適合32,爲什麼使用64?似乎很奇怪。 – iKenndac 2009-08-17 09:50:13

+1

你說得對,NSTimeInterval是雙重的。不過,我認爲它仍然算作「浮點型」。雙精度。 我也同意在很多情況下,NSInteger變成64位並不能改善很多代碼。但是這裏有一個可能性:一個隨機數發生器。在這種情況下,你真的關心速度,所以你可能想在更快的時候使用32位。但是,如果64位工作正常,那麼你在沒有太多(如果有的話)速度成本的情況下突然獲得隨機快樂(更長週期等)的巨大提升。 – Tyler 2009-08-17 13:01:35

+0

爲什麼我們可以投票一次?輝煌! – 2012-02-14 23:07:35

56

NSNumber是一個類,而不是原始類,用於需要將原始數字放入字典,數組或封裝它們時使用。 NSInteger,NSUInteger,CGFloat等是簡單的類型並且對應於(在像iPhone那樣的32-bt系統上)到int,unsigned intfloat

作爲一般規則,如果您需要在某處存儲號碼,請使用NSNumber。如果您正在計算,循環等,請使用NSIntegerNSUIntegerCGFloat

你可以用一個NSIntegerNSNumber

NSNumber *aNumber = [NSNumber numberWithInteger:21]; 

...並把它找回來:

NSInteger anInteger = [aNumber integerValue]; 

你可以找到更多資訊:http://iosdevelopertips.com/cocoa/nsnumber-and-nsinteger.html

+0

如果這個數字永遠不會是負數,我應該使用NSUInteger嗎? – mk12 2009-08-16 19:28:49

+0

我應該使用哪一個數字和小數? – mk12 2009-08-16 19:30:40

+0

爲什麼它是CGFloat而不是NSFloat? – mk12 2009-08-16 19:37:28

5

NSInteger的是就像C中的傳統int一樣。這是一個typedef。還有其他的像NSUInteger,CGFloat等等,都是基本類型的同義詞。

當您需要將數字粘貼到NSArray或NSDictionary中時,NSNumber非常有用。標準做法是使用這些集合與自己滾動;缺點是它們只能包含Objective-C對象。

的NSNumber基本上封裝了一個int(或浮動等)成的OBJ-C的對象(類似的「拳擊」基本類型C#/ Java的概念),其可被添加到一個數組:

NSArray * myArray = [[NSArray alloc] init]; 
[myArray addObject:3]; // invalid, will not compile. 
[myArray [NSNumber numberWithInt:3]]; // ok 

出於性能原因,如果可以的話,使用基本類型(如int,float,int [])。但是,有時您無法避免使用NSArray/NSNumber,例如當您正在將條目讀取或寫入.plist文件時。

+1

NSInteger,NSUInteger和CGFloat是32位或64位安全的typedef。 – Abizern 2009-08-16 22:54:06

0

如前所述,NSNumberNSObject子類。它不是C原語(,如int,unsigned int,float,double等等)。NSInteger,CGFloatNSUInteger簡單地說是typedefs在C原語上。

需要NSNumber產生於需要使用數字作爲需要對象的API的參數。例如,當您想要在NSArray,核心數據或NSDictionary中存儲號碼時。

是否還有更多我應該知道的原始圖像?那麼,NSNumber不是一個原始類型,它包裹各種數字(浮點數,整型,布爾值等)。你還應該瞭解一下NSValue,它是NSNumber的基礎。

是否有一個浮動?沒有「NS」的typedef浮動,但NSNumber能夠包裹任何浮點數:

NSNumber *myPi = [NSNumber numberWithFloat:3.1415926]; 

或者你可以使用CoreGraphics在原始類型CGFloat的。

2

的NSNumber一般用於存儲變量,NSUInteger用於算術

您可以通過這個改變的NSNumber到NSUInteger:

NSNumber *variable = @1; 
NSUInteger variableInt = [variable unsignedIntegerValue]; 

已經出現,但作爲一般規則說需要用*定義的變量是Objective C類,而不需要*的變量是C原語。