为什么NSObject在呈现其UIViewController时会被释放?

时间:2016-04-18 14:40:21

标签: ios swift memory-management uiviewcontroller nsobject

NSObject呈现视图控制器:

class myObject: NSObject {

    var myVC = UIViewController()

    func present() {
        let rootVC = UIApplication.sharedApplication().keyWindow!.rootViewController
        rootVC.presentViewController(myVC, animated: animated, completion: nil)
    }
}

为什么myObject会在myVC出现并且仍然在屏幕上显示时被解除分配(deinit被调用)?它不应该保持分配,因为myVC是它的财产吗?

更新:我面临的有效问题是,myVC会显示一个视图,其控件的委托为myObject。由于myObject已取消分配,控件无法再调用委托,因为我将委托引用为weak。但是,当我对委托myObject的强引用保持分配并且委托被调用时。但是对于代表来说,使用强大的参考资料有点腥味。

1 个答案:

答案 0 :(得分:1)

ARC内存管理基于所有权。一旦对象不归任何其他对象所有,它就会被取消分配。总是有一个拥有所有其他对象的根对象 - UIApplication。可以使用树来描述应用程序中所有对象的所有权:

UIApplication
  - UIApplicationDelegate
       - rootViewController
            - child controllers
               - child controllers ...
       - window
            - subviews
               - subviews ...
       - ... other objects

当然,您可以创建其他根对象(其他所有权树),例如通过使用单身人士。

如果您的实例不属于此层次结构树中的对象,则会取消分配该实例。因此,您应该以控制器仅由其他控制器拥有的方式构建您的所有权层次结构,而不是由自定义对象拥有。

如果您需要提及所有者,通常是时候使用weak引用,以避免周期性所有权。

另请注意,UIViewController在堆上占用了大量内存,因此在不需要时保留对它们的引用并不常见。在呈现新实例之前创建新实例更常见(尽管存在例外情况)。