概述
- 在一个 iOS 项目中,我有一个
UITableView
并且我正在尝试移动一行 UITableView。 - 在我的模型中,数据的顺序已经改变,所以我试图在表格中直观地显示它,这就是我使用
UITableView
's 方法的原因moveRowAtIndexPath:toIndexPath:
- 为此,我创建了一个
NSIndexPath
实例,并将其传递给 UITableView 的方法。
当泄漏发生时
- 当您使用 NSIndexPath 方法创建一个实例时
indexPathForRow: section:
(如代码部分所示),然后将其传递给UITableView
's 方法moveRowAtIndexPath: toIndexPath:
,它会泄漏。
笔记:
- 我正在使用 ARC(自动引用计数)
- XCode 4.3.1
- 我使用 Instruments (Xcode menu - 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 尝试释放已释放的内存,是否有一种安全的方法可以防止应用程序崩溃(请参阅上面的确切代码)。