2011-05-04 43 views
0

我是新來的OBJ-C和我有一個關於自動釋放一個問題一個鏈。可以爲幾種方法返回一個自動釋放變量嗎?例如:的OBJ-C自動釋放一個變量起來的方法

- (void) methodC { 
    Object anObj = [self methodB]; 
    //Do something with anObj 
} 

- (Object *) methodB { 
    return [self methodA]; 
} 

- (Object *) methodA { 
    Object anObj = [[anObj alloc] init]; 
    release [anObj autorelease]; 
} 

即使變量返回方法鏈並在頂部使用,變量是否仍然有效?或者是否必須保留在某處?

謝謝

回答

2

是的,在這種情況下它是有效的。如果有人耗盡autorelease池,你只需要擔心被釋放的變量。只要你已經編寫了每個函數,並且你沒有明確地使用自動釋放池,你就不必擔心從你下面的對象被釋放。

在絕大多數情況下,NSRunLoop中的代碼負責排空autorelease池。當你從你的應用程序代碼返回控制權到API代碼(例如從一個touchesBegan處理程序等返回)時,你不知道自動釋放池是否會被耗盡,所以你必須在最壞的情況下假設它會。在這種情況下,您必須retain您想保持引用的任何對象。

例如:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

Object *anObj = [self methodC]; // Your methodC as before -- anObj is valid 

[pool drain]; // anObj will be deallocated here 
+0

非常感謝您!這使一切都清澈透明! – 2011-05-10 04:54:31

0

該變量應該保持有效。如果實際上由某個其他對象「擁有」並且可能間接/無意地隨同它一起釋放,則只需要保留該對象。例如,如果您從數組中提取了一個對象,然後釋放該數組,則除非明確保留該對象,否則對象引用可能會失效。

有關更多細節,參見Object Ownership and Dismissal,特別是在自動釋放的部分和共享對象的有效性。後者使用以下代碼來說明如何「意外」使對象引用無效。

heisenObject = [array objectAtIndex:n]; 

[array removeObjectAtIndex:n]; 

// heisenObject could now be invalid. 

以下代碼顯示瞭如何使用retain來緩解此問題。

heisenObject = [[array objectAtIndex:n] retain]; 

[array removeObjectAtIndex:n]; 

// use heisenObject. 

[heisenObject release]; 
相關問題