私はちょうどを呼び出した後でもUIViewControllerがdeallocされないように、非常に厄介なUIViewController
のデバッグを終了しました。私はperformBatchUpdates
に電話をかけると、すぐにdismissViewControllerAnimated
、のUIViewControllerが漏洩しますと、そのUIViewController
のdealloc
メソッドを決して呼び出していない場合は、performBatchUpdatesの親UIViewControllerへの強い参照がアクティビティをリークするのはなぜですか?
self.dataSource.doNotAllowUpdates = YES;
[self.collectionView performBatchUpdates:^{
[self.collectionView reloadItemsAtIndexPaths:@[indexPath]];
} completion:^(BOOL finished) {
self.dataSource.doNotAllowUpdates = NO;
}];
基本的には:
は、私は次のコードブロックに問題を突き止め呼び出される。 UIViewControllerは永遠にハングアップします。
誰かがこの現象を説明できますか?私は、がある時間間隔、例えば500ミリ秒で実行されると仮定しているので、上記の間隔の後に、これらのメソッドを呼び出し、deallocをトリガすると仮定します。
修正はこのように表示されます。
self.dataSource.doNotAllowUpdates = YES;
__weak __typeof(self)weakSelf = self;
[self.collectionView performBatchUpdates:^{
__strong __typeof(weakSelf)strongSelf = weakSelf;
if (strongSelf) {
[strongSelf.collectionView reloadItemsAtIndexPaths:@[indexPath]];
}
} completion:^(BOOL finished) {
__strong __typeof(weakSelf)strongSelf = weakSelf;
if (strongSelf) {
strongSelf.dataSource.doNotAllowUpdates = NO;
}
}];
注BOOL
メンバ変数、doNotAllowUpdates
つまり、私はperformBatchUpdatesへの呼び出しが実行されている間、そのデータソース/ collectionView更新のいずれかの種類を防ぐ追加の変数です。
performBatchUpdates
にweakSelf/strongSelfパターンを使用する必要があるかどうかについては、オンラインでディスカッションしましたが、特にこの質問には何も見つかりませんでした。
私はこのバグの底に到達できたことをうれしく思いますが、私は見ているこの動作を私に説明するためにスマートなiOS開発者を愛するでしょう。
更新サイクルかどうかを確認するのは興味深いことです。どちらもどちらも自分のブロックを恒久的に保持してはならないと思います。コレクションビューをスーパービューから削除すると、バッチ更新が実行されなくなり、完了ブロックが呼び出されたり解放されることはありません。私の意見ではレーダーに値する。 – jrturton
@jrturtonこれは最も可能性の高い説明のようです!この洞察に基づいてデバッガでこれを再現できるかどうかがわかります。 – esilver
@jrturtonはデバッガで再解析できません...少なくとも両方のブロックが常に呼び出されるようです。途中で却下された場合は、内部がブロックを無視している可能性はありますか? – esilver