【问题标题】:ARC UIViewController not being dealloc-ed when popped from stack从堆栈中弹出时,ARC UIViewController 没有被解除分配
【发布时间】:2013-02-20 19:31:39
【问题描述】:

我有一个基于导航的应用程序,我在我的应用程序中疯狂地使用 MBProgressHud。当 ARC 发布时,我转换为 ARC,我经历了很多应用程序崩溃,我不明白为什么。我开始使用分析工具,发现我的内存消耗已经达到顶峰。我进入了我所有的视图控制器并重载了它们的 dealloc 方法,以包括一个写到 NSLog 来告诉我它们是否被释放。令我惊讶的是,使用 MBProgressHUD 的 ViewController 都没有被释放。

我这样调用 MBProgressHUD:

HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
[self.navigationController.view addSubview:HUD];
HUD.delegate = self;
HUD.labelText = @"Retrieving Signature";
[HUD showWhileExecuting:@selector(getSignature) onTarget:self withObject:nil animated:YES];

【问题讨论】:

  • 出于好奇,您预计它们何时会被释放?当您转到上一个视图时,或者只是当您调用 pop 方法时?
  • 当我调用 pop 方法时。当您使用 poptoviewcontroller 方法时,问题会变得更大,因为它可能导致当前视图控制器和您要弹出的视图控制器之间的所有视图控制器都没有被释放。
  • 我认为 poptoviewcontroller 不会或不应该取消分配,主要是出于可重用性和内存性能的原因。无论如何,您是否持有对该控制器的其他引用?
  • 没有其他对控制器的引用,因此它必须在从堆栈中弹出时被释放,否则它位于内存中并且在应用程序终止之前不会被销毁。

标签: objective-c automatic-ref-counting


【解决方案1】:

使用 MBProgressHUD 完成后,您需要通过将代理设置为 Nil、从超级视图中移除并最后将 HUD 设置为 nil 来清理 HUD。

HUD.delegate = nil;
[HUD removeFromSuperview];
HUD=nil;

【讨论】:

  • 或者给委托人__weak属性。委托可能持有对已解散视图控制器的强引用。
猜你喜欢
  • 2011-02-11
  • 2011-05-16
  • 2017-08-04
  • 1970-01-01
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多