【问题标题】:Memory not released after removing subviews (ARC)删除子视图(ARC)后未释放内存
【发布时间】:2014-07-26 13:10:53
【问题描述】:

我正在尝试解决“收到内存警告”问题。

我的应用有 2 个视图控制器,当您单击第一个视图控制器上的按钮时, 详细视图控制器出现。 详细视图控制器有一个继承 UIView 的视图,称为“topView”,并且该视图有许多子视图。 子视图也继承自 UIView,每个子视图有 2 个 UILabel。

我的问题是当您通过单击返回按钮返回到第一个视图控制器时, 'topView' 没有释放,即使我把下面的代码放在 viewDidDisappear 中。

如何释放topView的内存?

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [[self.topView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
    self.topView= nil;    
}

我错过了什么吗? 我想我走错了方向,所以请给我建议。

【问题讨论】:

  • 当您说它没有被释放时,您确定您正在查看正确的对象吗?在您的应用程序上运行 Instruments,看看是否确实如此。我还建议运行静态分析器来检查常见的内存错误。
  • 你是如何在 2 个控制器之间来回切换的?

标签: ios memory-leaks automatic-ref-counting


【解决方案1】:

我不确定,但这里有一个想法。当您调用此行时:

[[self.topView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

它删除了所有声明self.topView 为父视图的子视图。下一行:

self.topView = nil

不会删除顶视图本身,而是 nil 是您指向它的指针。因为视图由它们的父视图保留,所以这个对象会一直保留在内存中,直到视图控制器被移除并释放它的视图。

【讨论】:

  • 谢谢!添加[self.topView removeFromSuperview];后,内存正常释放。
【解决方案2】:

检查您的变量声明(弱、强)以确保 topView 对象没有保留在其他地方。 比如IBOutlet的通常用Weak Key声明:

@property (weak, nonatomic) IBOutlet UIView * topView;

【讨论】:

    猜你喜欢
    • 2013-09-24
    • 2013-07-01
    • 1970-01-01
    • 2012-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多