【问题标题】:Is calling UIView's removeFromSuperview enough, or is removing UIViewController required?调用 UIView 的 removeFromSuperview 是否足够,或者是否需要删除 UIViewController?
【发布时间】:2010-10-23 01:13:17
【问题描述】:

我有一个手动创建 UIViewController(不是 UINavigationController)的主视图,并将该控制器的视图添加为子视图。

然后子视图通过 [self removeFromSuperview] 自行关闭。我知道这会释放视图,所以这很好,但是我现在也想摆脱我在删除视图以释放内存时立即分配的 UIViewController,而不是等到主视图控制器被释放.

我可以避免使用 removeFromSuperview 并反向引用主视图控制器并让它关闭子视图并释放控制器,但感觉应该有更清洁的方法。

是否有既定的最佳实践来实现这一目标?

【问题讨论】:

    标签: objective-c iphone cocoa-touch uiviewcontroller


    【解决方案1】:

    正确的方法是让你的子控制器请求主控制器移除它。如果你想减少两个控制器之间的耦合,为你的子控制器创建一个委托协议:

    // This forward declaration avoids having a circular dependency 
    // between MySubcontroller and MySubcontrollerDelegate
    @class MySubcontroller;
    
    @protocol MySubcontrollerDelegate
    
    - (void)hideMySubcontroller:(MySubcontroller*)subcontroller;
    
    @end
    

    如果有其他信息需要子控制器与超控制器进行通信,这里是添加相关调用的好地方。您可能不需要立即这样做,但请记住您的应用的未来版本。

    然后给子控制器添加delegate属性:

    @interface MySubcontroller : UIViewController {
        id <MySubcontrollerDelegate> delegate;
        ...
    }
    @property (assign) id <MySubcontrollerDelegate> delegate;
    ...
    @end
    

    子控制器不应在其视图上调用removeFromSuperview,而是应在其委托上调用hideMySubcontroller:,并将self 作为参数传递。

    然后你的主控制器应该声明它实现了委托协议:

    @interface MyMainController : UIViewController <MySubcontrollerDelegate>
    ...
    @end
    

    主控制器创建子控制器时,应将子控制器的delegate属性设置为self。它应该实现一个hideMySubcontroller: 方法,该方法删除子控制器的视图,释放子控制器,并执行其他任何需要的操作。

    使用委托协议意味着子控制器不必知道什么样的对象会使用它;它只知道某处存在这样的对象并且它将符合委托协议。因此,两个控制器之间的耦合尽可能小。

    顺便说一句,如果你可以管理它,实际上最好保留子控制器以防你需要再次使用它;这将节省重新创建它所需的处理时间。 (但是,如果您收到内存警告,您应该释放它。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-05
      • 2019-09-30
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多