2012-05-07 78 views
13

我無法在任何地方找到它,所以我只是要求確認。是的,我知道它的基本原理,但我想我寧願得到那個權利,然後我犯了一百萬次錯誤:將整數添加到NSMutableArray

如果我做了以下操作,是否默認將「0」轉換爲NSNumber如果沒有,它是什麼對象類型),還是我必須做第二個代碼?如果是這樣,讓我知道,他們都編譯,所以我只是想知道哪一個是「正確的」(或者首選的),爲什麼)。

代碼1:

NSMutableArray array = [[[NSMutableArray alloc] init]]; 
[array addObject: 0]; 

代碼2:

NSMutableArray array = [[NSMutableArray alloc] init]; 
[array addObject: [NSNumber numberWithInt: 0]]; 

回答

21

NSMutableArray不採取原始類型

第二個選項是正確的。

+0

好涼。謝謝!!我會盡快將其標記爲正確的答案(它說我必須等待10分鐘才能接受此問題的答案) – MrHappyAsthma

+1

我很高興能夠提供幫助。 –

6

您不能將諸如int之類的圖元放入NSArray;您必須構造一個NSNumber實例來保存它。

如果我這樣做,不是在默認情況下投出「0」,以一個NSNumber(如果沒有,什麼對象類型吧)

沒有鑄造發生。不可能簡單地將一個圖元「投」到一個對象中,並且該圖元沒有對象類型。對象必須通過發送消息來構造(除了:見下文),這些發生在運行時;鑄造僅在編譯期間起作用。

這個工作的唯一原因是您選擇了0添加到數組中。這與nil的值相同,即「無對象」。如果您選擇了任何其他整數,那麼當您運行代碼時,您的手中會發生崩潰,因爲該值將用作指向不包含有效對象的內存的指針。

有趣的是,雖然從Clang 3.1或Apple的LLVM 4.0開始*有some new syntatical sugar用於從代碼中的文字創建對象。我們一直有文字NSStrings@"Lichtenstein"。使用新的編譯器,可以使用@字符同樣創建其他對象。

在這種情況下,要創建從字面整數一個NSNumber對象,你可以簡單地寫:

[array addObject:@0]; 

* (尚未公開的Xcode提供)

0

如前所述通過之前的回覆,您只能將對象(id類型)添加到像NSArray這樣的容器類中。

在這種情況下,一個有用的類是NSValue,它用作C和objective-C的非對象數據類型的容器。除了數字數據類型之外,它還可以包含結構和一些Objective-C原始數據類型,如NSRect

在這裏尋找更多詳情: https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/nsvalue_Class/Reference/Reference.html