这可能是一个关于内存管理的新手问题。
在 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/