swa*_*ner 2 ios objective-c-blocks retain-cycle
如果我dispatch_queue在一个街区内使用怎么办?什么是避免保留周期的正确方法,但也避免过早释放弱指针?
__weak MyClass *weakSelf = self;
[apiClient fetchData:^(...) {
typeof(self) selfref = weakSelf;
dispatch_async(dispatch_get_main_queue(), ^{
// using selfref here
}
});
Run Code Online (Sandbox Code Playgroud)
这是正确的做法还是我错过了什么?如何确保正确处理所有内容并且不会发生保留周期?我不能在这里做一些dealloc测试......
我的问题与此不同,因为我在第一个区块内有另一个区块.我问如何处理这种情况.
首先澄清一下,只有当对象指向自身时才会保留周期!这通常发生在对象的某些属性具有强引用返回对象(obj持有属性,它保存对象...)时,无论是通过块还是委托.
Blocks捕获对从外部范围传递给它们的任何对象的强引用- 包括self.当你声明一个块并且只是执行它时,这不是问题,因为块是在方法内声明的,而ARC将在方法的末尾解除它:
-(void)test
{
void(^aBlock)() = ^{
[self someMethod];
};
aBlock();
}
Run Code Online (Sandbox Code Playgroud)
但是,存储此块以供稍后使用(例如回调)时存在问题,如下所示:
@property(nonatomic, copy) void(^aBlock)();
-(void)test
{
_aBlock = ^{
[self someMethod];
};
}
Run Code Online (Sandbox Code Playgroud)
我们现在在ClassA中有一个强引用(我们的属性aBlock),它对ClassA有强引用(在aBlock实现中通过self).现在我们遇到了一个问题 - 这个课程指向自己,永远不会被解除分配!如果我们重写如下,则更为明显:
-(void)test
{
self.aBlock = ^{
[self someMethod];
};
}
Run Code Online (Sandbox Code Playgroud)
现在让我们打破你的代码只是为了确保我们正在谈论同样的事情:
__weak MyClass *weakSelf = self;
[apiClient fetchData:^(...) {
typeof(self) selfref = weakSelf; <---- outer block
dispatch_async(dispatch_get_main_queue(), ^{
// using selfref here <---- inner block
}
});
Run Code Online (Sandbox Code Playgroud)
一步一步走:
希望这一切对你有意义,你将用ObjC块光荣地战斗;)
| 归档时间: |
|
| 查看次数: |
2075 次 |
| 最近记录: |