我有一个weak
实例变量保存在UINavigationController.viewControllers
堆栈中的视图控制器上。
我的变量自动转到nil
,但视图控制器尚未解除分配(因为UINavigationController
拥有它)。
为什么我的弱引用被归零?
class NavController: SuperNavigationController
{
weak var weakViewController: UIViewController?
required override init() {
let rootViewController: UIViewController
if (/* whatever */) {
rootViewController = ViewController1(/*whatever*/)
weakViewController = rootViewController
} else {
/* whatever */
}
/*** `weakViewController` is not `nil` at this point ***/
/***
*** This superclass function just does:
*** super.init(navBarClass:toolbarClass:)
*** viewControllers = [rootViewController]
***/
super.init(rootViewController: rootViewController)
}
// Without this, I get an "unimplemented initializer" exception
override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}
...
}
但是一旦我到达viewDidLoad
,weakViewController
就是nil
,即使self.viewControllers.first
仍然是我初始化时的完全相同的对象。
UINavigationController
拥有viewControllers
的方式有什么奇怪之处吗?
修改 我设法在浅层确定并解决原因(请参阅下面的答案),但我仍然想知道为什么会这样。我很乐意接受并提出一个可以解释正在发生的事情的答案!
答案 0 :(得分:0)
调用super.init()
导致我设置的weak
子类实例变量被清零。
我通过等待设置weakViewController
直到调用super.init()
答案 1 :(得分:0)
弱参考说如果没有别的指向这个,我就不需要它了。因此,如果所有者是唯一一个拥有ref而且很弱的人,那么arc可以自由地解除分配。