【问题标题】:ARC project and release screen with UINavigationController带有 UINavigationController 的 ARC 项目和发布屏幕
【发布时间】:2012-08-24 04:06:29
【问题描述】:

我有一个带有自定义返回/主页按钮的项目,当用户点击它时,我会调用:

  -(IBAction)backBtnTapped:(id)sender {
    [appDelegate.navController popToRootViewControllerAnimated:YES];
}

现在我看到它没有调用 viewDidUnload 方法。为什么?如何在 ARC 项目中强制卸载 VC(及其中的视图)?

【问题讨论】:

    标签: objective-c ios uinavigationcontroller automatic-ref-counting


    【解决方案1】:

    viewDidUnload 方法只会在您有内存警告时调用,而不是在视图超出屏幕时调用,为此您可能需要使用 viewDidDisappear:viewWillDisappear

    为了更好地解释 viewDidUnload 方法,你可以看看这个问题:When is UIViewController viewDidUnload called?

    因此,您可能不需要关心何时调用 viewDidUnload,只需要它执行它需要执行的操作即可。另外,您正在处理viewDidDisappear:viewWillDisappear 中需要注意的事项。

    强制卸载可能不是解决这个问题的最佳方法,也许如果您在此方法中有很多逻辑,您需要将其更改为其他方法。不用担心调用 release 或 dealloc,只要确保您的项目中没有循环引用,并且您适当地使用了弱引用和强引用,这样弧才能正常工作。

    希望对你有帮助!

    【讨论】:

    • 我确定我没有循环引用,我只有在一个地方有一个指向这个屏幕的指针,当 popToRoot 时它仍然没有释放...
    • 这个视图控制器有一些委托或其他对象,也许是他创建的一些对象,对它有一些引用?也许它是其中一些视图的代表。
    • 这个控制器使用UIScrollViewDelegate和一些对象(也是由这个VC创建的)。 Inside View 也有代表:UIScrollViewDelegateUITableViewDelegate
    • 这个引用必须是弱的,如果它们是强的,它们会创建一个循环引用并且不会释放你的对象,也许你需要删除委托,因为这可以让你的对象保持活跃。如果我对您正在尝试做的事情以及您的代码有更多的了解,我可以提供的帮助远不止这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-25
    • 2012-09-17
    • 1970-01-01
    相关资源
    最近更新 更多