【问题标题】:Release UIViewController if available如果可用,释放 UIViewController
【发布时间】:2011-09-03 04:52:27
【问题描述】:

嘿, 我正在添加一个 UIViewcontroller 作为我当前视图的子视图。用这样的东西:

[self.view addSubview:viewcontroller.view];

用户可以与添加的视图控制器进行交互,所以我不能在我将它的视图添加为我的子视图后释放它,对吧?

所以我想在我的主视图控制器卸载时释放它的 dealloc 方法并在 viewDidUnload 中将其设置为 nil,对吧?

问题是,我添加为子视图的viewcontoller并不是每次都添加。所以问题是,我如何检查视图控制器是否被添加为子视图,如果是,则释放它。

非常感谢! 塞巴斯蒂安

【问题讨论】:

    标签: iphone ios memory-management uiviewcontroller subview


    【解决方案1】:

    你可以这样检查:

    if(viewController)     
    {
     [viewController release];
     viewController=nil;
    }
    

    是的,你需要把它放在你的 dealloc 方法中。

    【讨论】:

    • 感谢大家的快速帮助。 Suny 是第一个......我知道有一个简单的解决方案,像往常一样 :)
    • 你可以省略if(viewController)检查,因为在ObjC中,你可以毫无问题地向nil对象发送消息。
    • 是的,我知道消息发送到 nil 对象,但在这种情况下,我需要检查一下,因为如果开发人员没有将 nil 分配给视图控制器,那么它将占用一些垃圾值,然后将任何消息发送到垃圾值将导致痛苦的崩溃..至少这是我所知道的..干杯..!!
    【解决方案2】:

    根据 Apple 文档,UIViewController 实例应该管理一个填满整个屏幕的视图。如果您的视图没有填满屏幕,您可以继承 UIView 来处理委托或让超级视图作为委托工作。

    另外,视图的子视图包含在NSArray 的实例中,执行[myView subviews] 以返回此属性。询问返回的数组是否包含有问题的子视图,您可以相应地释放。

    但是,在不了解更多信息的情况下,听起来您确实需要重新考虑如何设置这一切。

    【讨论】:

      【解决方案3】:

      如果您正确阅读了您的代码:

      [self.view addSubview:viewcontroller.view];
      

      添加为子视图的不是控制器,而是它管理的视图。

      这是很重要的一点,因为这意味着控制器本身不会被保留。保留的是视图。

      所以你可以像往常一样继续在-dealloc 中发布你的viewController

       -(void)dealloc {
           [viewController release]; viewController = nil;
           ...
       }
      

      在您的viewControllerdealloc 中,如果您手动分配托管视图(或在必要时让您的控制器释放其视图有意义的任何地方),您将需要释放托管视图。

      另一方面,每当您的 superview 被释放时,您作为子视图添加的视图也将被释放(根据 Apple 的 addSubview 行为规范)。所以这里没什么好担心的。只需正确释放 viewController(并使视图控制器正确管理自己的视图)。

      还有一点注意:你不应该在viewDidUnload 中释放你的视图控制器。

      【讨论】:

        【解决方案4】:

        只需向 viewController.view 添加一个标签,然后测试 self.view 是否包含该标签。

        UIView *testView = [self.view viewWithTag:yourTag];
        if(testView!=nil){
           doStuff;
        }
        

        【讨论】:

          【解决方案5】:

          在我曾经贡献过的一些开源代码中,我们有一个名为 RELEASE_TO_NIL 的宏,它就是这样做的。

          #define RELEASE_TO_NIL(obj) if(obj != nil) { [obj release]; obj = nil; }
          

          你会这样使用它:

          RELEASE_TO_NIL(viewController);
          

          就这么简单。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-03
            • 2016-12-09
            • 1970-01-01
            • 2012-07-23
            • 1970-01-01
            • 1970-01-01
            • 2012-01-18
            相关资源
            最近更新 更多