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:
  • 为此,我创建了一个
    nsindepath
    实例,并将其传递给UITableView的方法
当泄漏累积时

  • 当您使用方法
    indexPathForRow:section:
    (如代码部分所示)创建nsindepath实例,然后将其传递给
    UITableView
    的方法
    moverowatinexpath:toindepath:
    时,它会泄漏
注意:

  • 我正在使用ARC(自动参考计数)
  • 代码4.3.1
  • 我使用仪器(Xcode菜单-Product>Profile)来确定内存泄漏
代码:(UITableViewController内部)

我尝试过的步骤

  • 注释掉对方法
    moveRowatineXpath:originAlinIndexPath to IndeXpath:
    的调用,可以防止内存泄漏
  • 我已经手动使用了
    CFRelease
    (不确定这在自动引用计数环境中是否是一种好的做法)

    CFRelease((uu桥空*)到indexpath)

问题:

  • 为什么会发生这种情况?有什么解决办法吗
  • 仪器的内存泄漏结果准确吗
  • UITableView的方法
    MoveRowatineXpath:originAlinIndexPath到IndeXpath:
    中是否存在错误
  • CFRelease是一种选择吗?如果CFRelease试图释放已经释放的内存,是否有安全的方法防止应用程序崩溃(请参阅上面的确切代码)

您发布的代码不应在ARC设置中导致内存泄漏(在没有ARC的情况下也不应导致内存泄漏)

如果您确实怀疑有bug(例如UITableView未能释放nsindepath对象),您可能会尝试手动释放它作为临时解决方法。但是,您确定动画完成后不会释放它吗?即使您没有动画,也可能是在到达空闲循环之前不会释放indexPath对象(这在GUI组件中很常见,当然在自动释放的对象中也很常见)


但是,为了确认它确实是一个泄漏,请尝试调查从长远来看内存是否随时间而增加(可能是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];