【问题标题】:Does dismissing a view controller call destructor of the ViewController是否解除 ViewController 的视图控制器调用析构函数
【发布时间】:2015-04-05 08:22:06
【问题描述】:

我有两个视图控制器ViewControllerA 和ViewControllerB。

现在ViewControllerA 通过这样的操作启动ViewControllerB

 self.view_library = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil]; //Initialize a view controller/
[self presentViewController:self.view_library animated:YES completion:nil]; //Display the new view controller

现在在 ViewControllerB 中,我将控件返回给 ViewControllerA

 [self dismissViewControllerAnimated:YES completion:Nil];

我的问题是ViewControllerB 的析构函数会被调用吗?我必须再次alloc 才能显示它吗?

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    您可能没有正确考虑这一点。此行创建对新 ViewControllerB 实例的强引用:

    self.view_library = [[ViewControllerB alloc] initWithNibName:@"ViewControllerB" bundle:nil]; //Initialize a view controller/
    

    (不要在变量名中加上下划线;这会使 ObjC 混淆,并且不利于 Cocoa 所依赖的键值编码约定。)

    这一行可能(但这不关你的事)为视图控制器添加了额外的保留:

    [self presentViewController:self.view_library animated:YES completion:nil]; //Display the new view controller
    

    这一行可能(但这不关你的事)从视图控制器中删除了一个保留:

    [self dismissViewControllerAnimated:YES completion:Nil];
    

    因此,将确定的与可能的相加,即 +1、+1、-1。所以你仍然在对象上有一个保留,它不会被释放(dealloc 与析构函数不同;它与 C++ 相关并且具有不同的语义)。

    如果在关闭视图控制器后,您将 self.view_library 设置为其他值,则它的保留将从对象中删除,并且(如果没有其他任何保留它)视图控制器将被释放。

    关键是您需要专注于平衡保留和释放,这主要由 ARC 为您处理(当您分配给强变量时保留一个,当该强变量停止引用它时释放一个)。

    对于您的具体问题,是的,应该可能重新创建视图控制器。这是常见的解决方案,即使并不总是需要。

    【讨论】:

      【解决方案2】:

      如果您使用 ARC 并且 self.view_library 具有 strong 引用,则不会被释放,因此您无需再次 alloc。

      【讨论】:

      • 所以简而言之它不调用析构函数?如果它不是一个强参考怎么办?
      • 它不会释放对象。如果它没有strong 引用,它应该是dealloc,你需要重新分配对象才能再次presentViewController。
      猜你喜欢
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2017-03-13
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-14
      相关资源
      最近更新 更多