【问题标题】:Memory not freeing up after popping viewcontroller using ARC使用 ARC 弹出视图控制器后内存未释放
【发布时间】:2013-07-01 07:54:02
【问题描述】:

您好,我的项目是基于 ARC 的,我正在使用 UINavigationController 在 ViewController 之间进行转换。我正在使用分析器来分析幕后发生的事情。我注意到,当我推送 ViewController 时,它会为其所有组件分配内存,而当我弹出它时,它不会释放分配的内存。

由于我使用 ARC,我无法实现 dealloc 或释放任何组件。我已经详细分析过了,我的项目没有内存泄漏。

我没有使用任何强大的属性来推送 viewController。这是我推动 ViewController 的方式。

viewController *obj = [[viewController alloc] init];
[self.navigationController pushViewController:obj animated:NO];

有什么线索吗? 我应该怎么做才能释放我消耗的内存。 请指教

【问题讨论】:

  • 您可以使用 ARC 实现 dealloc 方法。你不能打电话给[super dealloc]。如果您需要清理任何资源,您应该使用dealloc。很可能您的代码中有一个保留周期。在您的代码上运行分析器。
  • 实现 dealloc 的目的是什么,因为我无法释放其中的任何组件。
  • 您可能需要处理许多其他任务,例如删除通知观察者或清理临时文件等。如果您不需要任何类型的清理,则不要实现dealloc 方法。 ARC 将负责释放对象。但它不会释放卡在保留周期中的东西。
  • @rmaddy 一个问题:在使用 ARC 时,在viewWillDisappear: 中删除通知观察者不是更好吗?在使用 ARC 时,我从未使用过dealloc,而且我的方法一直是在视图不在屏幕上时移除不需要的观察者。因此,viewWillDisappear:.
  • 假设您将视图控制器 (vc) B 推送到 vc A 上。这将导致在 vc A 上调用 view(Will|Did)Disappear。我仍然希望 vc A 获得任何重要的通知设置它已正确更新到 vc B 被解雇时。但这取决于您的需要。这是一个很好的经验法则——保持平衡。如果你在viewWillAppear 中添加了一些东西,那么在viewDidDisappear 中删除它。如果您在init 中添加某些内容,请在dealloc 中删除它。你明白了。

标签: ios objective-c cocoa-touch automatic-ref-counting


【解决方案1】:

您的描述表明您有一个保留周期,这会导致对象未被释放。保留周期的典型来源是通过加载 NIB 文件分配的属性(通常声明为 IBOutlet)。

打破它们并释放对象的两种策略:

  1. 将属性声明为weak

    @property (nonatomic, weak) IBOutlet UILabel *statusLabel;
    
  2. viewDidUnload中将属性设置为nil

    - (void)viewDidUnload 
    {
        self.statusLabel = nil;
        [super viewDidUnload];
    }
    

【讨论】:

  • 你不应该再使用viewDidUnload了。
猜你喜欢
  • 1970-01-01
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多