Memory leaks UITableView-moveRowAtIndexPath导致内存泄漏
概述Memory leaks UITableView-moveRowAtIndexPath导致内存泄漏,memory-leaks,automatic-ref-counting,nsindexpath,uitableview,Memory Leaks,Automatic Ref Counting,Nsindexpath,Uitableview,概述 在iOS项目中,我有一个UITableView,我正在尝试移动UITableView的一行 在我的模型中,数据的顺序已经改变,所以我试图在表中直观地显示它,这就是为什么我使用了UITableView的方法moveRowatinexPath:toIndexPath: 为此,我创建了一个nsindepath实例,并将其传递给UITableView的方法 当泄漏累积时 当您使用方法indexPathForRow:section:(如代码部分所示)创建nsindepath实例,然后将其传递给
- 在iOS项目中,我有一个
,我正在尝试移动UITableView的一行李>UITableView
- 在我的模型中,数据的顺序已经改变,所以我试图在表中直观地显示它,这就是为什么我使用了
的方法UITableView
moveRowatinexPath:toIndexPath:
- 为此,我创建了一个
实例,并将其传递给UITableView的方法nsindepath
- 当您使用方法
(如代码部分所示)创建nsindepath实例,然后将其传递给indexPathForRow:section:
的方法UITableView
时,它会泄漏moverowatinexpath:toindepath:
- 我正在使用ARC(自动参考计数)
- 代码4.3.1
- 我使用仪器(Xcode菜单-Product>Profile)来确定内存泄漏
- 注释掉对方法
的调用,可以防止内存泄漏moveRowatineXpath:originAlinIndexPath to IndeXpath:
- 我已经手动使用了
(不确定这在自动引用计数环境中是否是一种好的做法) CFRelease((uu桥空*)到indexpath)强>CFRelease
- 为什么会发生这种情况?有什么解决办法吗
- 仪器的内存泄漏结果准确吗
- UITableView的方法
中是否存在错误MoveRowatineXpath:originAlinIndexPath到IndeXpath:
- CFRelease是一种选择吗?如果CFRelease试图释放已经释放的内存,是否有安全的方法防止应用程序崩溃(请参阅上面的确切代码)
但是,为了确认它确实是一个泄漏,请尝试调查从长远来看内存是否随时间而增加(可能是UITableView坚持使用其最新的indexPath对象,在该对象中可能不会出现问题)。另外,尝试使用NSZombieEnabled环境变量集运行调试器。当您尝试双重释放对象时,这将检测并闯入调试器。我没有足够的代表添加注释,因此我必须添加答案。我也看到了这个漏洞。我没有使用ARC,也没有使用BeginUpdate/EndUpdate来包装对MoveRowatineXpath:toIndexPath:Instruments的单个调用。每当我调用此方法时,Instruments都会声明NSIndexPath的32字节泄漏 对nsindepath的indexPathForRow:instation:的调用应返回一个不需要手动释放的自动释放对象。我怀疑MoveRowatingIndexPath:toIndexPath:错误地保留了对象,导致了泄漏 我添加了一些调试代码来记录调用MoveRowatineXpath:toIndexPath:之前和之后NSIndexPath的重新计数,并在调用之前得到1(这是在自动释放池中,所以这是预期的),在调用之后得到5(除非它已被添加到自动释放池中4次以上,否则肯定不是预期的!)
编辑:另请参见(需要Apple Developer帐户)我不确定如果对象已被取消引用但未被垃圾收集,仪器是否会指示内存泄漏,这就是为什么这是一个注释而不是答案。更新后您是否尝试过运行[[NSGarbageCollector defaultInstance]CollectExtreatly]呢?谢谢您的回复,我正在做一个iOS项目,所以我无法尝试垃圾收集。如果我错了,请纠正我非常感谢您的回复,我遇到了另一个问题,我将尝试NSZombieEnabled。
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];