弱引用被清零,但对象还没有被释放

Weak reference getting zeroed out, but the object hasn't been deallocated

我有一个 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)
    }

...
}

但是一旦我到达 viewDidLoadweakViewController 就是 nil,尽管 self.viewControllers.first 仍然是我在初始化时拥有的完全相同的对象。

UINavigationController 拥有它的 viewControllers 的方式有什么奇怪的吗?

编辑: 我设法在浅层次上确定并修复了原因(请参阅下面的答案),但我仍然想知道为什么会这样。我会很乐意接受并赞成一个可以解释发生了什么的答案!

调用 super.init() 导致我设置的 weak 子类实例变量被清零。

我通过等待设置 weakViewController 直到调用 super.init()

来解决这个问题

一个弱引用说如果没有别的指向这个,我不需要它。因此,如果所有者是唯一拥有 ref 的人并且它很弱,则 arc 可以自由释放它。

https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/AutomaticReferenceCounting.html