弱引用被清零,但对象还没有被释放
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)
}
...
}
但是一旦我到达 viewDidLoad
,weakViewController
就是 nil
,尽管 self.viewControllers.first
仍然是我在初始化时拥有的完全相同的对象。
UINavigationController
拥有它的 viewControllers
的方式有什么奇怪的吗?
编辑:
我设法在浅层次上确定并修复了原因(请参阅下面的答案),但我仍然想知道为什么会这样。我会很乐意接受并赞成一个可以解释发生了什么的答案!
调用 super.init()
导致我设置的 weak
子类实例变量被清零。
我通过等待设置 weakViewController
直到调用 super.init()
来解决这个问题
一个弱引用说如果没有别的指向这个,我不需要它。因此,如果所有者是唯一拥有 ref 的人并且它很弱,则 arc 可以自由释放它。
我有一个 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
的方式有什么奇怪的吗?
编辑: 我设法在浅层次上确定并修复了原因(请参阅下面的答案),但我仍然想知道为什么会这样。我会很乐意接受并赞成一个可以解释发生了什么的答案!
调用 super.init()
导致我设置的 weak
子类实例变量被清零。
我通过等待设置 weakViewController
直到调用 super.init()
一个弱引用说如果没有别的指向这个,我不需要它。因此,如果所有者是唯一拥有 ref 的人并且它很弱,则 arc 可以自由释放它。