0

のビューコントローラに保持されている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に着くと、weakViewControllerself.viewControllers.firstはまだ初期化するとき、私が持っていた、まったく同じオブジェクトであっても、nilです。

何か変わったことがありますかUINavigationControllerviewControllersを所有していますか?

EDIT: 私は(下記の私の答えを参照)浅いレベルで原因を特定して修正するために管理し、私はまだこの問題が発生した理由を知りたいのです。私は幸せに受け入れて、何が起こっているのかを説明できる答えをupvote!

+0

「rootViewController」はどこにも使用しません。 'init'の最後には範囲外です。その結果、弱い参照は何も指していません。 – rmaddy

+0

私は実際にこれを参照するコードで使用します。私の実際のコードは 'UINavigationController'の別のサブクラスをサブクラス化し、' initWithRootViewController'関数を持っています。私は質問のコードを更新します。それを指摘してくれてありがとう。 – mrgrieves

答えて

0

super.init()を呼び出すと、サブタイプインスタンス変数が0に設定されていました。

私はsuper.init()

0

への呼び出しの弱参照の後までweakViewControllerを設定するために待っていることで、これを固定は他に何もこれを指していない場合、私はそれを必要としないことを言います。したがって、所有者がrefを持っていて脆弱な唯一の所有者であれば、arcはそれを解放することが自由です。

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

+0

実際のオブジェクトは 'viewControllers'プロパティが' rootViewController'を保持しているので 'UINavigationController'によって保持されます。これは' weakViewController'によって参照されるのと同じオブジェクトです。実際のオブジェクトは解放されないので、 'weakViewController'自体がゼロになることは意味を成さない。 – mrgrieves

+0

'' '' 'rootViewController'''をnilにしているメカニックは、ARCにはそれに対する強い参照が見られません。値を使ってこれを '' UINavigationController''(またはあなたのサブクラスの連鎖のどこか他の場所)に渡すことは可能でしょうか?あなたが '' '' 'NavController''オブジェクトが破壊されている可能性はありますか? –

+0

よく 'rootViewController'は強い参照です。 'weakViewController'は弱いインスタンス変数です。ナビゲーションコントローラのスーパークラスは返す前に 'UINavigationController.viewControllers'プロパティを設定するので、' rootViewController'はスコープから外れません。 – mrgrieves

関連する問題