2012-09-18 203 views
1

如果我對已經初始化和分配的對象調用[alloc] init]會發生什麼?Objective-C - 初始化已經初始化的對象?

在我的具體情況我有使用NSMutableArray我在超Parent初始化NSMutableArray* someArray = [NSMutableArray alloc] init];

在子類中Child我需要someArray,但在特定的索引中插入的對象,例如3
因此,如果數組沒有項目,或者如果它的項目少於我試圖插入的索引(數組有4項,我想插入索引10),它會崩潰。

如果我在Child類中再次初始化someArray會發生什麼?將存儲在someArray中的指針替換爲正在初始化的新的指針,而「舊」指針只會泄漏?

編輯:

對不起,我的術語是有點過。我不是說要做[someObject alloc],而是做someObject = [SomeClass alloc] init];其中someObject以前曾經用SomeClass

+4

無論如何,它只會因'無法識別的選擇器異常而崩潰 - '+ alloc'不是實例方法。 – 2012-09-18 18:16:33

+0

我並不是指在'someArray'上調用'alloc',我的意思是調用'someArray = [NSMutableArray alloc] initWithCapacity:1000]',例如,其中'someArray'已經在父類中初始化。 – jere

回答

5

僅當您說「如果我在對象上調用[alloc] init]會發生什麼......」,您的術語是錯誤的。

以下行:

NSMutableArray* someArray = [[NSMutableArray alloc] init]; 

讀英文:

「發送alloc消息給NSMutableArray類對象,然後發送init消息的對象從第一消息中返回,然後店該對象從init返回到名爲someArray的指針變量中。「

我說要強調一個事實,即你不是「在現有對象上調用alloc/init」,你正在創建一個新對象,並將對這個新對象的引用存儲在你必須訪問的引用上先前的對象。既然你不再有對前一個對象的引用,你已經失去了正確釋放內存的能力,所以是的,你會泄漏它。

4

的實例初始化正確,它會泄漏。使用NSMutableArray insertObject:atIndex:

+0

我現在使用這個權利,當數組的容量是,例如4,我試圖插入索引10 – jere

+0

你必須先檢查數組邊界,並插入空對象或添加在數組的末尾。 C不是一種腳本語言,數組不會自動擴展 – Bink

1

有幾種方法可以想到做我認爲你想要的。一種笨拙的方法是將盡可能多的[NSNull null]對象放入數組中,以便將其填充到需要添加新對象的位置。如果您要存儲自己的對象,那麼您將替換現有的NSNull

也許更好的方法是使用字典而不是數組並將您的索引值轉換爲密鑰。

+0

是的,這是我最終做的,但我只是想知道如果指針被替換,內存泄漏或者如果編譯器在場景 – jere

+0

我相信'[NSNull null]'是一個單身人士,所以沒有額外的副本泄漏...即使有副本,只有數組是做任何保留,所以消除他們不會泄漏。 –