这可能是关于记忆功能的新手问题。
如何在目标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.
}];
答案 0 :(得分:11)
快速,不完整的回答:[request autorelease]
这个问题是块隐式保留在块体内引用的任何对象。因此,块保留request
,request
保留块,导致保留周期,并且没有人被解除分配。
要解决此问题,请将request
变量声明为__block
,以防止该块保留捕获的对象:
__block ObjectWithCallback *request = [[ObjectWithCallback alloc] init];
推荐阅读: