1

說我有一個類對象A(例如,視圖控制器)的對象的存儲器,這是否:管理呼叫委託回調塊

ObjectB *objectB = [[ObjectB alloc] init]; 

[objectB executeLongRequestThenDo:^ (NSDictionary *results) 
{ 
    self.datasource = results; 
    [self.tableView reloadData]; 
}]; 

對象A可以在任何時刻被釋放,所以我應該能夠取消objectB的請求,並告訴它不要在完成時執行該塊,對嗎?簡單地釋放它是不夠的?另外,我應該在executeLongRequestThenDo:之後撥打release嗎?

+0

autorelease objectB? – 2012-04-10 07:24:27

回答

4

不,ObjectA將不會在任何時候釋放 - 它將被保留,直到ObjectB完成操作。

可能-[ObjectB executeLongRequestThenDo:]將在塊上調用Block_copy。這將導致塊從堆棧移動到堆,並保留該塊直接引用的所有NSObject,即self

ObjectB完成後,它應該運行該塊,然後調用Block_release,這將釋放self。或者,如果您有某種取消操作的方法,ObjectB應該同樣釋放該塊。

(這是可能的對象B會做這一切間接調用的東西做的工作,像dispatch_async。)

參考:Blocks Programming Topics.

至於什麼時候你應該釋放objectB:這取決於是否它在長時間運行期間保留自己,或者不保留。爲了安全起見,我不會在你知道它完全完成之前發佈它,這將在你的塊的結尾處,或者在你調用它的取消方法之後。