Ios UIViewController的引用计数

Ios UIViewController的引用计数,ios,iphone,swift,uiviewcontroller,automatic-ref-counting,Ios,Iphone,Swift,Uiviewcontroller,Automatic Ref Counting,当我执行以下步骤时,我只是经历了一个奇怪的行为 在视图控制器方法中,创建视图控制器实例(本地实例) 将视图作为子视图添加到视图控制器的视图中 视图显示正确。该视图有一个按钮,当我单击该按钮时,它会因执行错误访问而崩溃。调试一段时间后,发现视图控制器实例已释放,并且由于控制器不存在,因此未激发button click事件 当我将视图控制器的声明移动到类级别时,它开始工作。我觉得如果视图控制器的视图在屏幕上,那么视图控制器实例不应该被保留 有什么想法吗 一些代码指针 class SomeViewCo

当我执行以下步骤时,我只是经历了一个奇怪的行为

  • 在视图控制器方法中,创建视图控制器实例(本地实例)
  • 将视图作为子视图添加到视图控制器的视图中
  • 视图显示正确。该视图有一个按钮,当我单击该按钮时,它会因执行错误访问而崩溃。调试一段时间后,发现视图控制器实例已释放,并且由于控制器不存在,因此未激发button click事件

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

    有什么想法吗

    一些代码指针

    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)
    
          }
    
    }
    

    当您创建这样的对象时

    let vc:SomeVC = SomeVC(nibName:"SomeVC", bundle:NSBundle.mainBundle())
    
    对象生存期等于创建对象的范围。 范围结束时,弧释放此对象和所有关联对象

    但是,当您在类级别添加它时,该对象的生存期等于所有者(SomeViewController)的生存期。所以,只有在所有者发布时才会发布

    你明白了吗?
    您也可以在

    中了解它,UIView不能保留UIViewController,因为UIViewController已经保留UIView。这将导致一个循环引用,任何东西都不会被释放。我得到了弧并计算出了范围方面。但是我特别想知道一个视图是否在内存中,备份它的视图控制器是否会释放它?另一种观点?或者什么样的视图?只是UIView,下一个响应者是UIViewcontrollerNo,它不会。如果您保留UIViewController的强引用。是的,Mathias注释解释了根本原因,循环强引用是内存泄漏。。。