弱引用被清零,但该对象尚未被释放

时间:2016-09-13 21:30:40

标签: ios swift uinavigationcontroller automatic-ref-counting weak-references

我有一个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的方式有什么奇怪之处吗?

修改 我设法在浅层确定并解决原因(请参阅下面的答案),但我仍然想知道为什么会这样。我很乐意接受并提出一个可以解释正在发生的事情的答案!

2 个答案:

答案 0 :(得分:0)

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

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

之后才修复此问题

答案 1 :(得分:0)

弱参考说如果没有别的指向这个,我就不需要它了。因此,如果所有者是唯一一个拥有ref而且很弱的人,那么arc可以自由地解除分配。

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