目标c-关闭集合视图控制器后未释放常驻内存和脏内存
Posted
技术标签:
【中文标题】目标c-关闭集合视图控制器后未释放常驻内存和脏内存【英文标题】:objective c - resident and dirty memory not getting released after dismiss of collection view controller 【发布时间】:2013-08-20 08:37:43 【问题描述】:我正在加载一个 2X2 集合视图,它有多个单元格,每个单元格都有 imageview。但是当我关闭这个控制器时,常驻内存和脏内存不断增加。
我的控制器中有多个视图,集合视图就是其中之一,我使用 addsubview 和 removefromsuperview 来在控制器中显示不同的视图。在我关闭控制器之前,我从控制器的子视图中删除所有子视图,包括集合视图。
但这不会释放常驻内存,并且在超过 500MB 后,应用程序会在引发内存警告后崩溃。 这是我在解除视图控制器之前删除子视图的代码 -
-(void)removeSubViewsOfView:(UIView *)view
NSArray *viewsToRemove = [view subviews];
for (int i = 0; i<[viewsToRemove count]; i++)
UIView *v = [viewsToRemove objectAtIndex:i];
[v removeFromSuperview];
v=nil;
我也在使用 ARC。
【问题讨论】:
为了让它更短,你可以这样做:[[view subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
删除不是问题 Gabriele。实际上,即使我从超级视图中删除了集合视图内存,它也没有被释放。 :(
【参考方案1】:
一些建议:
确保在视图 -dealloc
方法中将所有 IBOutlets
设置为 nil
如果您正在使用视图控制器包含,请致电-removeFromParentViewController
:
- (void)removeSubViewsOfView:(UIView *)view
NSArray *viewsToRemove = [view subviews];
for (int i = 0; i<[viewsToRemove count]; i++)
UIView *v = [viewsToRemove objectAtIndex:i];
[v removeFromSuperview];
NSViewController* vController = nil;//retrieve your view controller
[vController removeFromParentViewController];
v=nil;
它不会产生脏内存,但如果你在对象之间保持相互strong
引用,它可能会泄漏对象,也就是。 A保留B,B保留A
希望对你有帮助:)
【讨论】:
谢谢米查。所以这就是我所做的——我的一些 UI 元素/插座没有被释放,因此内存堆不断增加。所以我明确地将它们都设为 nil。即使我们关闭视图控制器,ARC 也不会释放内存,这实际上很奇怪。但我们不能为此责怪 ARC,因为它只是引用计数的自动化。终于我的问题得到了解决。耶!! 是的,ARC 是一个很好的工具,但它不会做任何魔法......所以还有一些事情需要手动完成。以上是关于目标c-关闭集合视图控制器后未释放常驻内存和脏内存的主要内容,如果未能解决你的问题,请参考以下文章