我想我理解保留周期是多么简单,但我不能完全理解更复杂的情况。
这是导致保留周期的代码。 (右?)
[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
self.loading = NO;
}];
为避免保留周期,我会创建一个对self
的弱引用:
__weak typeof(self) welf = self;
[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
welf.loading = NO;
}];
我希望到目前为止我是正确的。
这里有趣的地方。我有一个计算和缓存文本高度的方法,然后在tableView上调用reloadData。该方法异步执行,并在完成后调用它的completionBlock(在mainThread上)。
__weak typeof(self) welf = self;
[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
[welf relayoutWithCompletion:^(CGPoint offsetBeforeReload) {
welf.loading = NO;
if (dataChanged) {
[welf save];
}
}];
}];
此代码会导致保留周期,因为welf
会在relayoutWithCompletion:
的completionBlock中捕获自身吗?我是否正确认为因为welf是一个弱参考,我会避免保留周期?
如果我更进一步怎么办?
__weak typeof(self) welf = self;
[self.dataController loadInitialWithCompletion:^(BOOL dataChanged) {
[welf relayoutWithCompletion:^(CGPoint offsetBeforeReload) {
if (offsetBeforeReload.y > 64) {
[welf scrollToPoint:offsetBeforeReload completion:^{
welf.loading = NO;
[welf save];
}];
}
}];
}];
它一直欢迎......
答案 0 :(得分:2)
没有。你的弱自己是一个弱参考。弱引用不会导致保留周期。这就是使用弱的原因。