のビューコントローラに保持されているweak
インスタンス変数があります。弱い参照がゼロになっても、オブジェクトの割り当てが解除されていません
私の変数は自動的に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
self.viewControllers.first
はまだ初期化するとき、私が持っていた、まったく同じオブジェクトであっても、nil
です。
何か変わったことがありますかUINavigationController
はviewControllers
を所有していますか?
EDIT: 私は(下記の私の答えを参照)浅いレベルで原因を特定して修正するために管理し、私はまだこの問題が発生した理由を知りたいのです。私は幸せに受け入れて、何が起こっているのかを説明できる答えをupvote!
「rootViewController」はどこにも使用しません。 'init'の最後には範囲外です。その結果、弱い参照は何も指していません。 – rmaddy
私は実際にこれを参照するコードで使用します。私の実際のコードは 'UINavigationController'の別のサブクラスをサブクラス化し、' initWithRootViewController'関数を持っています。私は質問のコードを更新します。それを指摘してくれてありがとう。 – mrgrieves