【问题标题】:ARC UINavigationController stack not getting deallocated when presented as modal view controller当呈现为模态视图控制器时,ARC UINavigationController 堆栈没有被释放
【发布时间】:2012-01-04 13:02:21
【问题描述】:

首先:我将我的应用程序移植到 ARC,一切似乎都正常。但现在我发现了一个问题:我有一个 UINavigationController,它以模态方式呈现,其堆栈上有一些 UIViewController。但是当我关闭模态视图控制器时,堆栈中的视图控制器似乎没有被释放。这是我的工作:

UIViewController* root = [[UIViewController alloc] init];
UINavigationController* navi = [[UINavigationController alloc] initWithRootViewController:root];
[self presentModalViewController:navi animated:TRUE];

然后我从根开始推送更多视图控制器,但这并不重要。事实是当我稍后打电话时

[self dismissModalViewControllerAnimated:TRUE];

root 不会被释放。当然,在我的代码中,root 是 UIViewController 的子类,我跟踪 dealloc 和 viewDidUnload,但没有调用任何内容。

有什么想法吗?

【问题讨论】:

    标签: iphone ios uinavigationcontroller modal-dialog automatic-ref-counting


    【解决方案1】:

    你的导航控制器里面有什么?可能是其他东西(可能是导航控制器中的视图控制器)是罪魁祸首,这导致了链条的上游,这意味着导航控制器没有被释放。

    无论哪种方式,您发布的代码都是正确的,因此如果您的导航控制器在调用 dismissModalViewController 后没有被释放,则表明其他东西仍然对它或其依赖项之一具有活动引用。我知道这不能回答你的问题,但你可能不得不四处寻找。

    【讨论】:

    • UINavigationController 内部没有什么特别之处,它是标准类。并且没有更多对 UINavigationController 或 UIViewcontroller 的引用,然后显示在上面。我不想发布太多不必要的代码。但我将在该主题上进行一些实验并稍后发布我的结果......
    • 好吧,好吧,我实际上找到了一个对 ViewController 的强引用(我感到羞耻)。它是另一个自定义类的委托,并且该委托被声明为 id 委托;在 ARC 下默认为 __strong。对不起!因此,对于所有在 ARC 下使用委托的人:如果迁移工具不适合您,请让他们变得虚弱!
    • 无需抱歉 - 知道这一点很有用!当我必须迁移项目时,我必须注意一些事情。
    【解决方案2】:

    由于您没有显示实际代码,因此很难判断根视图控制器发生了什么。

    但是,对于 ARC,如果您有一个指向对象的强指针,它将不会被释放。我怀疑您在将其添加到导航控制器后仍持有此控制器。

    但是,没有看到你的代码,我无法判断。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 2011-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多