管理以编程方式实例化的视图控制器的实例

时间:2015-05-03 22:12:30

标签: ios objective-c swift memory-management automatic-ref-counting

如果我以编程方式从我的故事板中实例化ViewController,一旦它不再显示在应用程序中,它的内存是否会被释放?

我将它显示为模态。

2 个答案:

答案 0 :(得分:3)

扩展@ Schemetrical的答案,您需要确保至少有一个强大的VC引用,或者它将立即解除分配。

这是一个崩溃:

func viewDidLoad()
{
  childVC = self.storyboard.instantiateViewControllerWithIdentifier("childVC")
  self.view.addSubview(childVC.view)
}

在上面的示例中,当前VC的内容视图保留了新创建的视图的所有权,但没有人保留视图控制器的所有权。一旦函数返回就会释放它,并且第一次尝试引用现在解除分配的VC时,你崩溃了(假设有一个按钮,它的动作指向VC。)

如果将VC推入导航堆栈,导航控制器将获得所有权。一旦它从堆栈中弹出,它就会被释放。如果您以模态方式呈现VC,系统将在屏幕上获得所有权。一旦被解雇,它就会被解除分配。

如果你希望VC在弹出/解散后继续存在,你需要在某处保留一个强有力的参考。您可以在应用委托,单身或应用程序的根视图控制器中保存对它的引用。

答案 1 :(得分:1)

只要vc上没有任何强力,它就会被释放。一旦你解除了那个vc,视图就会释放它对象的引用,因为没有引用,它就会释放。