UIViewController的引用计数

时间:2015-04-06 19:32:06

标签: ios iphone swift uiviewcontroller automatic-ref-counting

当我执行以下步骤时,我只是遇到了一种奇怪的行为,

  1. 在视图控制器方法中,创建一个View控制器实例(本地实例)。
  2. 将视图作为子视图添加到视图控制器的视图中。
  3. 视图显示正确。该视图有一个按钮,当我单击该按钮时,它会与EXEC_BAD-ACCESS崩溃。调试一段时间后,发现视图控制器实例是释放,并且由于控制器不存在而未触发按钮单击事件。

    当我将视图控制器的声明移动到类级别时,它开始工作。我觉得如果视图控制器的视图在屏幕上,则不应该保留视图控制器实例。

    有什么想法吗?

    一些代码指针。

    class SomeViewController:UIViewController{
          var workingVC:SomeVC?
          func crashingMethod()
          {
              let vc:SomeVC = SomeVC(nibName:"SomeVC", bundle:NSBundle.mainBundle())
              let delegate:AppDelegate = UIApplication.sharedApplication().delegate
              let applWindow:UIWindow = delegate.window!
              applWindow.addSubview(vc.view)
    
          }
    
         func workingMethod()
          {
              self.workingVC = SomeVC(nibName:"SomeVC", bundle:NSBundle.mainBundle())
              let delegate:AppDelegate = UIApplication.sharedApplication().delegate
              let applWindow:UIWindow = delegate.window!
              applWindow.addSubview(self.workingVC!.view)
    
          }
    
    }
    

1 个答案:

答案 0 :(得分:0)

当你创建这样的对象时

let vc:SomeVC = SomeVC(nibName:"SomeVC", bundle:NSBundle.mainBundle())

对象生命周期等于创建它的范围。 当范围结束时,ARC将释放此对象和所有关联对象。

但是,当您在类级别添加它时,此对象的生命周期等于所有者的生命周期(SomeViewController)。因此,它仅在所有者发布时发布。

你明白了吗? 您也可以在Memory Management Section in Apple Documentation

中阅读相关内容