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]
这个问题是块隐式保留在块体内引用的任何对象.因此该块保留request并request保留该块,导致保留周期并且没有人被解除分配.
要解决此问题,请将request变量声明为__block,以防止块保留捕获的对象:
__block ObjectWithCallback *request = [[ObjectWithCallback alloc] init];
Run Code Online (Sandbox Code Playgroud)
推荐阅读:
| 归档时间: |
|
| 查看次数: |
1880 次 |
| 最近记录: |