2013-04-03 84 views
1
arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]]; 

的NSMutableArray從viewDidLoad中

arrayOfElements = [[NSMutableArray alloc] init]; 
arrayOfElements = [someObj getArray]; 

什麼區別初始化?

第一個arrayOfElements似乎不會丟失它的對象,但它返回的計數是numberOfRowsInSection:(NSInteger)section,但第二個是。當我以第二種方式執行時,我得到EXC_BAD_ACCESS。

編輯:

我現在可以假設現在,這是最好的方式,

arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]]; 

因爲我初始化與任何內容的陣列將autorelease倒是和我在當前班有一個完全獨立的陣列,即viewDidLoad,抱歉,ViewController

+0

您是否在使用ARC? –

+0

第二個版本是昂貴的。您創建了一個數組並將其轉儲並將新數組存儲到該數組中。 –

+0

第二種情況arrayOfElements將是不可變的 – BergP

回答

2

這條線從現有陣列

arrayOfElements = [NSMutableArray arrayWithArray:[someObj getArray]]; 
創建 NSMutableArray

這種組合首先創建一個NSMutableArray,然後立即將其丟棄與什麼是由[someObj getArray]

arrayOfElements = [[NSMutableArray alloc] init]; // Create new NSMutableArray 
arrayOfElements = [someObj getArray];   // Throw away the newly created array and replace with the result of [someObj getArray] 

如果返回替換它你沒有使用ARC,那純粹是幸運的,任何一個都可以工作。

在這兩種情況下,arrayOfElements都被分配了一個autorelease的對象 - 這個對象很快就會被清除(很可能是下一個流水線)。只有偶然的情況是,沒有其他的東西寫在這個內存點上,它允許你的一個實現仍然可以工作。


如果你不使用ARC那麼你真的應該更新您的項目中使用它會處理很多情況下,這樣的你。

您一定要使用屬性(不是裸露的ivars),因爲這有助於減少內存問題(對於非ARC),併爲您的代碼提供更一致的接口。

在你的頭(或類擴展)聲明這樣

@property (nonatomic, strong) NSMutableArray *arrayOfElements; 

現在對於ARC財產非ARC你可以簡單的做

[self setArrayOfElements:[[someObj getArray] mutableCopy]; 

你可以做

NSMutableArray *array = [[someObj getArray] mutableCopy]; 
[self setArrayOfElements:array]; 
[array release]; array = nil; 

另請注意,getArray是一個不好的方法名稱。

除非間接返回一個或多個值,否則不需要使用「get」。 Coding Guidelines

+0

什麼是最好的解決方案,爲什麼? – esh

+0

感謝您的意見和編碼指導。幫助我學習。 – esh

0

當您添加對象從另一個陣列可變數組,試試這個:

[arrayOfElements addObjectsFromArray: [someObj getArray]]; 
+0

這將與'NSMutableArray'初始化一起工作。 – esh

+0

但實際上我要求澄清。我想知道爲什麼真的。 – esh

0

如果你不使用ARC,你需要確保它的保留。

if (arrayOfElements) { 
    [arrayOfElements release]; 
} 
arrayOfElements = [[NSMutableArray alloc] initWithArray:[someObj getArray]];