iOS7 UITableView内存泄漏

iOS7 UITableView内存泄漏,uitableview,ios7,memory-leaks,Uitableview,Ios7,Memory Leaks,我有一个扩展部分的UITableView。当用户第一次加载表视图时,将加载每个节的父记录。当用户按下父单元格时,我从数据库中检索子数据,然后使用 [tableView insertRowsAtIndexPaths:expandCollapseArr withRowAnimation:UITableViewRowAnimationTop]; 然后,如果用户再次单击父单元格,则使用删除子单元格 [tableView deleteRowsAtIndexPaths:expandCollapseArr

我有一个扩展部分的UITableView。当用户第一次加载表视图时,将加载每个节的父记录。当用户按下父单元格时,我从数据库中检索子数据,然后使用

[tableView insertRowsAtIndexPaths:expandCollapseArr withRowAnimation:UITableViewRowAnimationTop];
然后,如果用户再次单击父单元格,则使用删除子单元格

[tableView deleteRowsAtIndexPaths:expandCollapseArr withRowAnimation:UITableViewRowAnimationNone];
上述代码按预期工作。问题是,在iOS 7上,使用ARC时,插入和删除的单元格永远不会从内存中删除,即使在取消UitableView和UIViewController本身的存储之后也是如此。使用应用程序一段时间后,将抛出内存警告,应用程序将崩溃

如果我取出insertRowsAtIndexPaths和deleteRowsAtIndexPaths调用,每次只调用
[tableView reloadData]
,当我使用视图控制器时,一切正常,所有内存都被释放,但随后我松开了插入和删除动画

使用
insertRowsAtIndexPaths
deleteRowsAtIndexPaths
时,似乎存在本机内存泄漏

还有其他人遇到过这个问题吗

这里是我正在使用的重用标识符代码

NSString *searchStr = @"Store ";
NSRange match = [displayString rangeOfString: searchStr];
if (match.location == NSNotFound) {
        CellIdentifier = [NSString stringWithFormat:@"Cell%@%@", displayString, TBL_NAME];
} else {
        CellIdentifier = [NSString stringWithFormat:@"Store%@", TBL_NAME];
}

ExpandableTableCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil ) { 
    cell = [[ExpandableTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; }

您不能执行insertRowsAtIndexPaths:和deleteRowsAtIndexPaths:吗?只有在动画完成后,才能重新加载数据?您是否要将单元格排队?如果是,表视图应该只实例化足够的单元格来填充屏幕。请显示您的
单元格FORROWATINDEXPATH
和任何自定义单元格代码。这看起来是一个苹果bug。我看到了一个简单的开始更新,然后是结束更新,中间什么都没有。禁用调用周围的动画可以避免此问题。如果将内部动画的完成块复制到堆块中,它似乎永远不会消失,堆块保留了UITableView本身,这意味着它及其所有缓存单元不会消失。还张贴了关于链接问题的解决方案,基本可行;这种方法(或改进版)可能是除苹果在iOS更新中解决此问题之外的唯一方法。该解决方案确实涉及到swizzling核心UIView方法,但非常安全。它基本上用一个非常小的完成块包装完成块,并确保正确地解除分配真正的完成块。在苹果修复漏洞之前,小包装块仍然会泄漏,但这是一个小得多的问题。我确实希望很快发布另一种解决方案,但它将基于相同的方法。@gabbayabb我在上发布了我的发现。