問題タブ [strong-references]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
880 参照

swift - クロージャによるプロパティの初期化

私はARCと強い参照サイクルを調べていて、私のこのコードに出くわしました:

selfクロージャー内のメソッドでの参照addTargetは、強い参照サイクルを作成していないようです。

誰かが理由を説明できますか?

UIViewまた、コンパイラから継承を削除すると、不平を言い始めることに気付きました: Use of unresolved identifier 'self'.

誰かがこれも説明できますか?なぜこの場合に発生し、最初のケースでは発生しないのですか?

0 投票する
2 に答える
257 参照

swift - 強力な参照サイクルを引き起こす NotificationCenter - Swift 5

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

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

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

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

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

以前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)