【问题标题】:UIViewController is getting retainedUIViewController 被保留
【发布时间】:2012-01-25 14:02:35
【问题描述】:

在我的应用程序中,我有三个 UIViewController 对象。

V1 -> V2 -> V3

当我从 V2 迁移到 V3 时,我使用的是 push,而从 V3 迁移到 V2 时使用的是 pop。但不知何故,V3 的对象被保留了。

我认为当我们弹出时,堆栈中的所有对象 - V3 对象 - 都会被删除。但是,在这种情况下不会发生这种情况。

有人可以建议如何解决这个问题吗?

谢谢

【问题讨论】:

  • 没有发生可能是因为你保留了它。
  • 你能告诉我们(带代码)你是如何在 pop 和 push 方法中分配、初始化和(自动)释放这些视图控制器的吗?

标签: iphone ios4 uiviewcontroller


【解决方案1】:
 V3 *v3 = [[[V3 alloc] initWithNibName:@"V3" bundle:nil] autorelease]; 
             [self.navigationController pushViewController: v3 animated:YES];

这是在导航栏中推送控制器的标准方式..

要么您缺少 v3 上的自动发布或发布,要么您将其保留在其他地方..

【讨论】:

  • 我不是自动释放它,而是手动释放它,如下所示。 V3 *v3 = [[V3 alloc] initWithNibName@"V3"]; [self.navigationController pushViewController:v3 动画:YES]; [v3 版本]; v3=无;
  • 将其保留在其他地方怎么样?
【解决方案2】:

就像你使用导航控制器推动视图控制器一样,在下面添加一行来释放它。

向我们展示一些您实际在做什么的代码。然后我们可以准确地告诉你。

【讨论】:

    【解决方案3】:

    除了 Shubhank 所说的,确保在 UIViewController 本身内平衡这些方法中的保留和释放:

    viewDidLoad & viewDidUnload

    viewWillAppear: & viewWillDisappear:

    还要确保在您的 dealloc 方法中释放具有“保留”或“复制”属性的任何属性。

    只要您在 dealloc 中正确清理所有内容,并且 UIViewController 本身的保留/释放计数是平衡的(请参阅 Shubhank 的回答),您就没有问题,所有内容都会按预期释放。

    【讨论】:

      【解决方案4】:

      当你使用导航推送时,它会调用下一个视图的方法

      - (void)viewDidLoad{
      }
      

      当你回到之前的视图时,它只会被调用

      - (void)viewWillAppear:(BOOL)animated{
      }
      

      现在,当您使用 pop 导航返回时会发生什么情况,然后它没有调用您的 viewDidLoad,因此您的 NSMutableArray 以及您在该视图中分配的任何对象都不会被分配..

      【讨论】:

      • 这是不正确的。推送 UIViewController 并不意味着将对 viewDidLoad 进行调用。 可能在推送后被调用,但由于是第一次访问 UIViewController 的视图属性(触发 loadView)。
      猜你喜欢
      • 2015-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-22
      • 2013-07-19
      • 1970-01-01
      • 2011-03-12
      相关资源
      最近更新 更多