2013-12-13 54 views
0

我在一個項目中看到一種新的alloc & init NSMutableArray方式。是這樣的一個 ​​這工作得很好,我想嘗試一下其是否可以使用NSMutableArray *array = [NSMutableArray mutableCopy];其打造成功,但使用時得到這個錯誤:+[NSMutableArray addObject:]: unrecognized selector sent to class 0x38bedc2c這個NSMutableArray alloc&init如何工作?

現在我想知道怎麼做一個工作?爲什麼B錯了? A比正常的alloc & init更好? 任何幫助將不勝感激。

+2

第一種形式,'NSMutableArray * array = [@ [] mutableCopy];',是用於創建可變數組的「智能alec版本」,實際上是混合了懶惰,混淆,誤解和錯誤觀點。它應該完成:'NSMutableArray * array = [[NSMutableArray alloc] init];'。 – CouchDeveloper

+0

同上。雄辯。發現。 – uchuugaka

回答

1

在第一種情況下,你首先初始化一個空NSArray實例;將@[]視爲等同於[[NSArray alloc] init]。因此,您發送mutableCopy到正確的實例,所以它工作正常。

在第二種情況下,您將消息發送給類(與其實例相反),這沒有多大意義,因爲addObject消息只能發送給實例,而不是發送給實例課本身。

+0

第一種情況比正常情況好?還是一樣? – chancyWu

+0

@Chancy,如果通過正常你的意思是'[NSMutableArray alloc] init]',是的,出於所有實際的目的,它們是等價的。 – houbysoft

+0

(儘管我期望'[NSMutableArray alloc] init]'會稍微快一點) – houbysoft

0

@[]表示沒有對象的NSArray。它返回NSArray,然後將其mutableCopy複製到array

+[NSMutableArray addObject:]無效,因爲addObject是一種實例方法,您試圖將其用作類方法。

即使NSMutableArray *array = [NSMutableArray mutableCopy];不正確!沒有任何東西被創造出來,它並沒有被分配和定位。如果您記錄數組,它將只打印字符串NSMutableArray。你也不能使用array來添加對象和其他操作。

您應該使用NSMutableArray *array = [NSMutableArray array];

+0

或簡單地說:'NSMutableArray * array = [NSMutableArray array];' –

+0

@JamesWebster:是的,你是對的,而複製粘貼時,我犯了一個錯誤...糾正... –

2

mutableCopy是在NSObject類中聲明的實例方法。它在任何實例上被調用來創建它的可變副本。

在第一種情況下@[]將創建一個自動釋放NSArray實例上調用mutableCopy將創建NSMutableArray實例。

在第二種情況下,在該類上調用mutableCopy是不正確的,因爲它不意味着被稱爲該方式。這將被編譯,但會在運行時導致異常。 希望有所幫助!

1

第一個是懶打字。
你應該避免它。 它從數組文字語法創建一個空的NSArray並創建一個可變副本。 這是通過創建一個不必要的數組節省一點打字。

你應該只使用 [NSMutableArray的新] 或者 [NSMutableArray裏的alloc]初始化] 或者,如果可能的,因爲你提前知道初始容量 [NSMutableArray的頁頭] initWithCapacity:someNSUIntegerValue]

什麼否則以上是懶惰。 只有在實際複製某些內容時才使用mutableCopy。

+0

對,兄弟 - 你把話說出我的嘴巴;) – CouchDeveloper