2011-09-24 39 views
2

我的對象完成了他們的工作。他擁有對工作流程的控制,但現在必須在創建它的對象中調用一個函數,並且必須被釋放。問題是這樣的:如何自我毀滅objective-c中的對象?

AnObject *object; 
- (void)function 
{ 
    object = [[AnObject alloc] init]; 
    [object doYourJob]; 
    //The program continue to run next line, it don't stop here. So, I can't send a [object release] here 
} 

- (void)callThisWhenFinish 
{ 
//do something 
//can't call [object release] because it is in the stack and run a line of a released object 
} 

所以,我怎麼能釋放對象的內存,我試試這個:

  • callThisWhenFinishfunction發送[object release]。 - 失敗!該程序仍然需要運行AnObject的一些行。
  • 用委託的方式來運行callThisWhenFinish。 - 失敗!我無法發佈AnObject,因爲它在功能callThisWhenfinish完成時嘗試運行下一行。
  • 使用NSNotificationCenter將通知張貼到callThisWhenFinish。失敗!當我發佈通知時,立即撥打callThisWhenFinishAnObject可以運行下一行,並釋放,導致崩潰。
  • 使用具有延遲的相同NSNotificationCenter。這種方式有多安全?我怎麼知道AnObject不會再被調用?
  • 使用[object autorelease]。這項工作,但我不知道什麼時候完成。我的AnObject使用大量RAM,並且必須儘可能快地釋放。

任何其他的想法?

+1

使一個實例變量。 – Eimantas

+0

那是'AnObject *對象;'實際上應該是一個全局? – Chuck

回答

4

如果您的對象正在做後臺工作,那麼在此期間保留它自己是一個好主意。這樣,你就不必擔心它被釋放,直到完成。您的function方法可以在開始操作後安全地釋放它,但在它準備好之前它不會被釋放。

AnObject *object; 
- (void)function { 
    object = [[AnObject alloc] init]; 
    [object doYourJob]; 
    [object release]; 
} 
- (void)callThisWhenFinish { 
    //do something 
} 

在AnObject:

- (void)doYourJob { 
    [self retain]; 
    // enter background and call backgroundMethod 
} 
- (void)backgroundMethod { 
    // This is the method which doYourJob calls in the background to do the work 
    // Do some work 
    [delegate callThisWhenFinish]; 
    // do whatever else needs to be done 
    [self release]; 
} 
+0

+1我以前用過這個方法比較成功 –

+0

我們今天怎麼用ARC來做到這一點? –

+1

@Thomas您可以使用實例變量作爲其強引用,在啓動任務時爲其分配'self',並在完成時爲其分配'nil'。此外,在後臺執行的某些方法會自動保留目標對象,如NSThread,以便您可以使用它們。 – ughoavgfhw

1

如果你不能讓伊娃,爲什麼不能是這樣的:

- (void)callThisWhenFinishAndRelease:(id)obj 

然後你有一個指針。