1

NotificationCenter を使用すると、強い参照サイクルが発生しているようです。

デバイスの回転を観察するために NotificationCenter を使用しています。(これはデバイスの回転を決定する最良の方法ではないと主張する人もいますが、自動レイアウトが使用されておらず、ストーリーボードも使用されていないため、現在これが私の唯一のルートのようです)。

deinit {}ViewControllerでオブザーバーを削除しても、 が呼び出されることはありません。viewWillDisappearviewDidDisappear

import UIKit

class TestVC: UIViewController {


    deinit {
        print("TestClass Deinit") //not being triggered ever
    }

    @objc private func rotationDetected(sender: Any) {
        print("we rotated")
    }

    override func viewDidDisappear(_ animated: Bool) {
        //NotificationCenter.default.removeObserver(UIDevice.orientationDidChangeNotification)
    }
    override func viewWillDisappear(_ animated: Bool) {
        NotificationCenter.default.removeObserver(UIDevice.orientationDidChangeNotification)
    //NotificationCenter.default.removeObserver(self) //also doesn't work

    }
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(true)
        NotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: .main, using: rotationDetected)

    }
    override func viewDidLoad() {
        super.viewDidLoad()
    }


}

なぜこれが発生しているのか、どのように解決するのかについてのアイデアはありますか?

また、他の方法で回転検出を決定する方法についての新しいアイデアにもオープンです (ただし、自動レイアウトやストーリーボードは使用されていません)。

以前TestVC()に使用 した場所に到達するには を使用し、戻るには を使用します。self.navigationController?.pushViewController(TestVC(), animated: true)ViewControllerpop

プレゼントがなければ、Observerクラスは正しくなりdeinitます。

解決済み

下にマークされた回答のおかげで、強力な参照サイクルが削除されました。

交換するだけNotificationCenter.default.addObserver(forName: UIDevice.orientationDidChangeNotification, object: nil, queue: .main, using: rotationDetected)

NotificationCenter.default.addObserver(self, selector: #selector(rotationDetected), name: UIDevice.orientationDidChangeNotification, object: nil)

4

2 に答える 2