如何在使用块回调时释放对象

时间:2011-05-24 14:39:53

标签: iphone objective-c memory-leaks callback objective-c-blocks

这可能是关于记忆功能的新手问题。

如何在目标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.
}];

1 个答案:

答案 0 :(得分:11)

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

这个问题是块隐式保留在块体内引用的任何对象。因此,块保留requestrequest保留块,导致保留周期,并且没有人被解除分配。

要解决此问题,请将request变量声明为__block,以防止该块保留捕获的对象:

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

推荐阅读: