目标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-关闭集合视图控制器后未释放常驻内存和脏内存的主要内容,如果未能解决你的问题,请参考以下文章

程序结束后未释放的内存会怎样? [复制]

对等体断开连接后未释放SSL内存

Android 中的内存泄漏和内存溢出

如何释放子视图控制器的内存

ARC 和dismissModalViewControllerAnimated:视图控制器内存未释放

如何判断我的视图控制器是不是会从内存中释放?