【问题标题】:Adding a ViewControllers's view as subView将 ViewControllers 的视图添加为子视图
【发布时间】:2012-12-21 12:06:32
【问题描述】:

我正在将一个 ViewControllers 视图作为子视图添加到另一个 ViewController,

例子:

在 FirstScreen 视图控制器中我这样做,

         [self.view addSubview:self.secondScreen.view]; 

一旦我从 FirstScreen 中删除它,我就会这样做

         [self.secondScreen.view removeFromSuperView];
          self.secondScreen=nil;  

但在添加 subView ViewDidLoad 方法时会调用但 removeFromSuperView ViewDidUnLoad 不会被调用。

我的问题

1) 一旦我将实例 self.secondScreen 设置为 nil,我的 secondScreen 中的所有对象都会被释放

2)这样做是否安全,这样我就不会收到任何泄漏或内存警告

【问题讨论】:

    标签: iphone ios viewcontroller


    【解决方案1】:

    假设您的应用从 iOS 5.0 开始支持,您需要将其添加为,

    [self addChildViewController:self.secondScreen];
    [self.view addSubview:self.secondScreen.view]; 
    

    同样地,您可以使用removeFromParentViewController 删除,然后从超级视图中删除。检查apple documentation here.

    ViewDidUnLoad 从 iOS 6.0 起已弃用,不会被调用。检查the documentation here.

    关于您的问题,

    1) 我的 secondScreen 中的所有对象都会在我释放后被释放 将实例 self.secondScreen 设置为 nil

    一旦你完成了self.secondScreen 类,一旦你将它设置为nil,它就会开始释放这个类中的对象。如果您使用 ARC,则不必担心释放问题。操作系统会处理这些事情。

    2)这样做是否安全,这样我就不会得到任何泄漏或内存 警告

    是的,如果您使用 ARC,这很好。对于非 ARC,您需要确保已在此类中正确释放所有变量。确保在这种情况下保留/释放都是平衡的。

    【讨论】:

    • 请参阅 WWDC 2011 第 102 场会议“实施 UIViewController 遏制”,大约在第 16 分钟左右。您不应在未实施的控制器上使用这些方法,因为它们当时有他们没想到的孩子。危险:“此方法仅供自定义容器视图控制器的实现调用”
    【解决方案2】:

    当视图从 ViewController 中移除时不会调用 ViewDidUnload,它会在视图从内存中卸载时调用。 iOS 文档对此有以下警告:

    当控制器的视图从内存中释放时调用。 (在 iOS 6.0 中已弃用。视图不再在内存不足的情况下被清除 条件,所以这个方法永远不会被调用。)

    请注意“已弃用”和“从未调用此方法”这一事实。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-01
      • 1970-01-01
      • 2020-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多