【问题标题】:Safe to release UINavigationController?安全释放 UINavigationController?
【发布时间】:2011-01-21 16:33:03
【问题描述】:

我正在为弹出框创建一个 (UIPopoverController) 弹出框控制器和 (UINavigationController) 导航控制器,其中两个控制器都在头文件中声明。然后,当它们被创建时:

myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]];

myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];

此时,释放 myNavController 是否安全?

【问题讨论】:

    标签: iphone objective-c uinavigationcontroller uipopovercontroller


    【解决方案1】:

    如果这个类不再引用它,你可以在初始化你的 popover 控制器后释放你的导航控制器。

    【讨论】:

    • 在MyPopoverControllerClass中,我在myNavController创建后调用pushViewController,用户点击弹出框上显示的项目...所以我不应该在这里释放myNavController吗?
    【解决方案2】:

    如果myNavController 是一个实例变量,那么你不应该在你的dealloc 方法之前释放它。如果它只是一个局部变量,你应该在该方法中最后一次引用它之后释放它。

    【讨论】:

    • 完全正确;如果您有保留的引用,则您“拥有”该对象。如果不再需要该引用,您应该释放它。如果它是一个实例变量,并且您在 dealloc 之外是 release,那么将 nil 分配给实例变量也是一个好主意,这样您就不会得到一个悬空指针。
    【解决方案3】:

    想想Object Ownership and Disposal 约定,它简要地说,如果你分配了一个对象,你就是它的所有者。

    换句话说,您有权在不需要时立即释放myNavController

    从另一方面来说,UIPopoverController 应该使用保留获得对 myNavController 的所有权。

    所以,(再次)是的。你可以放心地释放myNavController

    在少数情况下不遵守所有权约定规则。特定方法的文档中提到了这些异常。但事实并非如此。

    让我们为您的 sn-p 应用这些规则: 在第一行

      myNavController = [[UINavigationController alloc] initWithRootViewController:[[[MyPopoverControllerClass alloc] initWithNibName:@"MyPopoverNib" bundle:[NSBundle mainBundle]]autorelease]];
    

    myNavController 的保留计数至少为 1。

    第二行

    myPopoverController = [[UIPopoverController alloc] initWithContentViewController:myNavController];
    

    将导致myNavController 的保留计数至少 2,通过在initWithContentViewController 内部取得所有权。

    【讨论】:

    • 不要不要致电retainCount。鉴于UIPopoverController 是 UIKit 框架中的一个类,任何给定时间的保留计数完全是一个实现细节。试图给一个绝对值赋予意义是徒劳的。将保留完全视为所有权和增量;如果您不再需要拥有一个对象,则释放它。
    • @bbum: UIPopoverController 继承自NSObject,所以可以传递retainCount 消息。我在这里使用的[x retainCount] 之类的表达式纯粹是说明性的,并且意味着对象至少 具有此值。请告诉我我到底想分配什么?
    • 您说“将导致 myNavController 的保留计数为 2”。这是一个错误的假设。传递 retainCount 并期望给定的绝对值是不行的。这是对其他明智正确答案的坏(不正确)建议
    • 好的,用相应的备注更新了答案。我只是尽量简单地解释主要思想。
    猜你喜欢
    • 2011-05-03
    • 1970-01-01
    • 2021-02-02
    • 2015-12-10
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 2017-08-20
    • 1970-01-01
    相关资源
    最近更新 更多