iphone - 使用 block 回调时如何释放对象

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

这可能是一个关于内存管理的新手问题。

在 objective-c 中使用 block 作为回调时如何释放对象?

(更新代码)

@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.
}];

最佳答案

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

问题是 block 隐式保留了 block 体内引用的任何对象。因此,该 block 保留了 request,而 request 保留了该 block ,导致了一个保留周期,没有人被释放。

为了解决这个问题,您将 request 变量声明为 __block,这会阻止 block 保留捕获的对象:

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

推荐阅读:

关于iphone - 使用 block 回调时如何释放对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6112206/

相关文章:

iphone - 编辑时 uitableview 单元格上的长按问题

delphi - FastMM4,如何读取日志文件?

ios - UITableView 继续查看 Controller 不工作

ios - 在设备上反向查看 Controller

iphone - 如何在右耳机上播放音频,在左耳机上播放音乐?

ios - 让UIAccessibilityPostNotification在UIAlertView中完成

iphone - FMDB 包装器 VS 核心数据 : Which is easier to Use & Maintain?

ios - 成功登录StackMob后如何将 "push"设置为新的 View Controller

javascript - node.js readFile内存泄漏

c++ - 将 QString 转换为 char* 以用于第 3 方库的内存清理问题,如何解决?