【发布时间】:2016-04-18 14:40:21
【问题描述】:
NSObject 提供了一个视图控制器:
class myObject: NSObject {
var myVC = UIViewController()
func present() {
let rootVC = UIApplication.sharedApplication().keyWindow!.rootViewController
rootVC.presentViewController(myVC, animated: animated, completion: nil)
}
}
当myVC 出现并且在屏幕上仍然可见时,为什么myObject 会被释放(调用deinit)?它不应该保持分配状态,因为myVC 是它的属性吗?
更新:我面临的有效问题是myVC 显示了一个带有控件的视图,其代表是myObject。因为myObject 已解除分配,所以控件无法再调用委托,因为我将委托引用为weak。但是,当我对委托 myObject 有强烈引用时,仍会分配并调用委托。但是对代理使用强引用有点可疑。
【问题讨论】:
-
委托通常是弱引用,因此行为是预期的。呈现的控制器不拥有委托!
-
架构问题。您的对象是您的控制器的所有者,但没有人拥有该对象,因此它被释放。
-
可能是因为没有人持有对 MyObject 的引用...这是呈现/关闭 UIViewController 的错误方式,为什么要将它包装到 MyObject 中?您应该在没有任何中介的情况下从另一个 ViewController 实例中显示一个 viewController,并且您不会遇到委派问题
-
谢谢大家,这当然是有道理的。我想我会让 myObject 成为一个单例来解决这个问题。在我的例子中,
myObject配置了视图控制器,但配置非常复杂,我宁愿在呈现视图控制器的代码中没有它。 -
如果你想这样做,但建议至少将 myObject 重命名为 DisplayController 之类的名称或符合逻辑的名称
标签: ios swift memory-management uiviewcontroller nsobject