2012-05-05 65 views
0

在這裏,我們有從About Memory Management一個物體在ObjC節目自動釋放

一些實例中在第一示例

- (NSString *) fullName { 
    NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", self.firstName,  self.lastName] autorelease]; 
    return string; 
} 

在本例中是如何將上述方法稱爲

{ 
    Person *aPerson = [[Person alloc] init]; 
    NSString *name = aPerson.fullName; 
    [aPerson release]; 
} 

所以我假設在代碼流到達大括號的花括號後,*名稱被自動釋放。

這是真的嗎?

一般來說,對象的自動釋放取決於引用該對象的變量的範圍和生命週期。

是否有任何標準來管理Objective-C程序中對象的自動釋放池?

謝謝。

+1

在這種情況下,是的,'name'是自動釋放的,但僅僅是因爲getter顯式地分配並自動釋放它的返回值。在其他任何情況下,如果您沒有源代碼,則無法預測對象的生命週期和自動釋放狀態。 – 2012-05-05 10:47:03

回答

1

的自動釋放對象的釋放發生時該對象已被autorelease推到自動釋放池被釋放/排出明確,前提是該對象的那一刻保留數爲0 +(即,沒有其他人但autorelease池正在保留它)。

一個對象沒有得到自動釋放,僅僅是因爲它超出了範圍。在你的例子中,我們只能肯定地說它不會在之前發佈最後的大括號,但正如H2CO3所說,沒有相關的源代碼,我們無法預測它何時被清理。在Cocoa(Touch)應用程序中,帶有runloops的線程有一個循環級自動釋放池,在每次runloop迭代結束時它會耗盡。如果您的方法是從runloop調用的(例如,作爲事件處理函數回調的一部分),則自動釋放的對象將在處理程序代碼返回後不久發佈;否則就沒有這樣的保證。

請注意,以上適用於非ARC環境;其他人可能會確認在使用ARC時是否仍然有效。