5

這可能是一個關於內存管理的新手問題。如何在使用塊回調時釋放對象

如何在目標c中使用塊作爲回調來釋放對象?

(更新後的代碼)

@implementation ObjectWithCallback 
- (void)dealloc { 
    [_completionHandler release]; 
    [super dealloc]; 
} 
- (void)doTaskWithCompletionHandler:(void(^)(void))handler { 
    _completionHandler = [handler copy]; 
    // Start tasks... 
} 
- (void)tasksDone { 
    // Do callback block 
    _completionHandler(); 
    // Delete reference to block 
    [_completionHandler release]; 
    _completionHandler = nil; 
} 

// Use of the ObjectWithCallback 
ObjectWithCallback *request = [[ObjectWithCallback alloc] init]; 
[request doTaskWithCompletionHandler:^(void){ 
    // Callback called and task is ready. 
}]; 
+0

你想釋放什麼對象,爲什麼你不能在塊內釋放它? – Richard 2011-05-24 14:44:22

+0

是什麼讓你覺得你不能刪除塊中的對象? – bbum 2011-05-24 14:55:10

+0

他想發佈'request'。 – Caleb 2011-05-24 15:03:33

回答

11

快速,不完整的答案:[request autorelease]

這樣做的問題是,隱式塊保持被該塊的主體內引用的任何對象。所以該塊保留requestrequest保留該塊,導致保留週期,並且沒有人獲得釋放。

爲了彌補這一點,你申報你的request變量__block,這將阻止塊從保持拍攝對象物:

__block ObjectWithCallback *request = [[ObjectWithCallback alloc] init]; 

推薦閱讀:

+0

__block不應該在這個CAS中使用。對象的使用壽命顯然與塊有關,塊的保留確保了這一點。 – bbum 2011-05-24 14:56:30

+0

@bbum我想我理解你的意思,但是如果塊引用'request',這會不會導致保留週期?我想一個解決方法是'ObjectWithCallback'在調用它之後釋放回調塊。 – 2011-05-24 15:06:41

+0

啊 - 是的 - 與OP的問題正交的不同問題。 DERP。 – bbum 2011-05-24 18:06:42

相關問題