概要
- iOS プロジェクトで
UITableView
は、UITableView の行を移動しようとしています。 - 私のモデルでは、データの順序が変更されているため、テーブルで視覚的に表示しようとしています。そのため、
UITableView
の方法を使用しましたmoveRowAtIndexPath:toIndexPath:
- そのために
NSIndexPath
、UITableView のメソッドに渡すインスタンスを作成しました。
漏れが発生したとき
- メソッドを使用して NSIndexPath インスタンスを作成し
indexPathForRow: section:
(コード セクションを参照)、それをUITableView
のメソッドmoveRowAtIndexPath: toIndexPath:
に渡すと、リークが発生します。
ノート:
- ARC(自動参照カウント)を使用しています
- X コード 4.3.1
- Instruments (Xcode メニュー - Product > Profile) を使用して、メモリ リークを特定しました。
コード: (UITableViewController 内)
NSIndexPath *newIndexPath = [NSIndexPath indexPathForRow:newRow inSection:0]; //leaking
[self.tableView beginUpdates];
[self.tableView moveRowAtIndexPath:originalIndexPath toIndexPath:newIndexPath]; //I think this causes the leak
[self.tableView endUpdates];
私が試した手順
- メソッドの呼び出しをコメント アウトすると
moveRowAtIndexPath:originalIndexPath toIndexPath:
、メモリ リークが防止されます 私は手動で使用
CFRelease
しました(これが自動参照カウント環境での良い習慣であるかどうかはわかりません)CFRelease((__bridge void *)toIndexPath);
質問:
- なぜこれが起こるのですか?それに対する解決策はありますか?
- 計測器のメモリ リークの結果は正確ですか?
- UITableView のメソッドにバグはあります
moveRowAtIndexPath:originalIndexPath toIndexPath:
か? - CFRelease はオプションですか? CFRelease が既に解放されているメモリを解放しようとした場合にアプリがクラッシュするのを防ぐ安全な方法はありますか (上記の正確なコードを参照)。