我想我了解如何创建简单的保留周期,但我不完全了解更复杂的情况。
这是会导致保留周期的代码。(正确的?)
[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
在 completionBlock 中捕获自身relayoutWithCompletion:
?我是否正确地认为因为 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];
}];
}
}];
}];
一路下来还好...