62

ViewController オブジェクトを作成して、それをナビゲーション コントローラーにプッシュしています。オブジェクトがスタックからポップされているとき - オブジェクトは解放されておらず、Deinit は呼び出されていません。その理由は何ですか?

プッシュするコードは次のとおりです。

self.navigationController?.pushViewController(CustomViewController(), animated: true)

そして、ポップするコードは次のとおりです。

 self.navigationController?.popViewControllerAnimated(true)
4

13 に答える 13

13

NotificationCenter が表示されたビューへの強力な参照を制御していたため、解放されなかったときに同じ問題が発生しました。したがって、次のように[weak self]をブロックに追加する必要がありました。

(viewDidLoad 内)

NotificationCenter.default.addObserver(forName: .showFoo, object: nil, 
  queue: OperationQueue.main) { [weak self] (notification) in
    if let foo = notification.userInfo?["foo"] as? Foo {
            self?.afooButton!.setImage(UIImage(named: "foo"), for: .normal)
    }
}
于 2016-11-03T03:24:13.113 に答える
10

deinit にいくつかの行コードを追加します。Empty deinit にブレークポイントを配置すると、コンパイラは停止しません。

deinit {
print("any thing")
}

それが動作します ;)

于 2016-12-08T13:20:10.590 に答える
6

同様の問題に遭遇しました。私の問題は、デリゲート割り当てがクラス タイプ プロトコルで「弱い」と指定されていないコントロールへの強い参照によって引き起こされたようです。

于 2015-05-05T14:45:47.597 に答える
4

私が見つけたのと同じ問題がありましたが、他のクラスデリゲートの弱参照を作成していませんでした

protocol SomeClassDelegate : AnyObject {
    func someClassDelegateMethod(<param>)
}

class SomeClass: NSObject {

    // Make delegate weak reference 
    weak var delegate:InfractionDataManagerDelegate? = nil
    < some code >
}

現在、実装クラスでdeinitが呼び出されています。

于 2019-06-21T07:02:38.540 に答える