単純な保持サイクルがどのように作成されるかは理解していると思いますが、より複雑な状況を完全には理解していません。
リテイン サイクルを引き起こすコードを次に示します。(右?)
[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];
}];
}
}];
}];
それはずっとウェルフです...