UIViewController
サブクラス内に次のメソッドがあるとします。
- (void)makeAsyncNetworkCall
{
[self.networkService performAsyncNetworkCallWithCompletion:^{
dispatch_async(dispatch_get_main_queue(), ^{
[self.activityIndicatorView stopAnimating];
}
});
}];
}
self
ブロック内への参照により、UIViewController
インスタンスがブロックによって保持されることはわかっています。performAsyncNetworkCallWithCompletion
のプロパティ (または ivar) にブロックを保存しない限り、NetworkService
保持サイクルがないと考えるのは正しいですか?
performAsyncNetworkCallWithCompletion
上記の構造により、システムによって以前にリリースされたとしても、終了するまで UIViewController が保持されることになります。しかし、 ( iOS 6 が aのバッキングメモリを管理する方法が変更されUIViewController
た後) システムが my の割り当てを解除する可能性は高いでしょうか (または可能でしょうか? )。UIViewController
CALayer
「weakSelf/strongSelf ダンス」をしなければならない理由があるとすれば、次のようになります。
- (void)makeAsyncNetworkCall
{
__weak typeof(self) weakSelf = self;
[self.networkService performAsyncNetworkCallWithCompletion:^{
typeof(weakSelf) strongSelf = weakSelf;
if (!strongSelf) {
return;
}
dispatch_async(dispatch_get_main_queue(), ^{
[strongSelf.activityIndicatorView stopAnimating];
}
});
}];
}
しかし、これは無意識に醜いので、必要がない場合は避けたいと思います。