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

Mar*_*ino 5 iphone memory-leaks objective-c 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.
}];
Run Code Online (Sandbox Code Playgroud)

Dan*_*son 11

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

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

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

__block ObjectWithCallback *request = [[ObjectWithCallback alloc] init];
Run Code Online (Sandbox Code Playgroud)

推荐阅读: