問題タブ [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.
ios - UIViewController ループの強い参照は、dealloc を妨げません
- ARCを使用しています。
- ここでの調査のケースには、カスタム UITabBarController とその UIViewControllers の 1 つが含まれます。
- Tabbar は、あるクラスのオブジェクトへの強い参照を持っています。そのオブジェクトは、Tabbar 自体への強い参照も持っているため、dealloc が呼び出されないループが発生しました。
- ViewController と同じことで、オブジェクトへの強い参照があり、オブジェクトがビューコントローラーに戻ります。その割り当ても解除されていません。しかし、それは親の uitabbarcontroller が割り当て解除されていないために発生します。タブバーからオブジェクトへの強い参照を削除すると、ビューコントローラーにはまだ強いループ参照があるため、論理的にはタブバーのみを割り当てる必要がありますが、両方の割り当てが解除されます。
ここで何が起こっているのか、どんな考えでも。これを2時間ほど調査しましたが、結果はありませんでした。
viewcontroller と uitabbarcontroller が同じように動作しないのはなぜですか?
swift - メソッドを関数に渡すときに強い参照を避ける
クロージャーを取る関数にメソッドを渡す場合、someFunc(closure: someMethod) or
someFunc() { [unowned self] in self.someMethod() }` のいずれかを使用できます。
最初のものは短いですが、強力な参照になります。この強い参照を避けながら使用するにはどうすればよいですか?
これは、漏れているものと良いものの両方を含むデモです: https://swiftlang.ng.bluemix.net/#/repl/581ccd3a0bdc661a6c566347
短い選択肢は 26 行目にあり、 で置き換えるdoNothing
と{ [unowned self] notif in self.doNothing(notif) }
、強い参照がなくなります。
何か案は?
swift - ディクショナリ内のサブビューへの強い参照は、参照サイクルを引き起こしますか?
可変サブビューを持つビューがあります。サブビューは、このサブビューのタイプを記述する列挙型を使用して設定されます。私の質問は、以下が強い参照サイクルを引き起こすかどうか、またはこれを行うためのより良い方法があるかどうかです:
辞書が弱いとは言えません。そのため、スーパービューには、サブビュー階層内の各 ControlBarItem への参照と、タイプ別にインデックス付けされたこの辞書への参照があります。これは、ControlBar のデリゲートとして機能する viewController から BarItem の状態を変更する必要がある場合があるためです。
ios - メモリ リークを引き起こす強い参照を持つビュー コントローラー
ビュー コントローラの 1 つで強い参照に問題があり、メモリ リークが発生しています。まず、私のセットアップ:
2 つのビュー コントローラー (v1 および v2)。v1 は v2 にセグエし、v2 には v1 に戻る閉じるボタンがあります。v2 には、接続が確立されるまで無限に再接続を試みるコードが含まれています。(red5pro を使用したビデオ ストリーミング)。コードは次のとおりです。
私の状況では継続的な再接続が望ましいですが、ユーザーが v2 を終了すると、再接続を停止したいと考えています。しかし現在、ユーザーが v2 を離れた場合でも、再接続は無限に続きます。
これは、v2 には強力な参照があり、ユーザーが終了した後も存続し続けるためであることがわかりました。したがって、これにより、reconnect() メソッドを無限に呼び出しているコードが引き続き実行されます。すべてを弱い参照に変換するために v2 をクリーンアップしようとしていますが、いくつかの代替案も検討しており、それに関していくつか質問がありました。
viewDidDisappear などで再接続を強制終了する方法はありますか? ビュー コントローラーが破棄されなくても、少なくとも再接続プロセスは停止しますか?
v2 を終了して v1 に戻った後、ユーザーが再び v2 に移行した場合、毎回 v2 の新しいインスタンスを作成するのではなく、v2 の同じインスタンスを割り当てることは可能ですか?
ios - 強参照サイクルの原因究明
View Controller が解放されない原因を見つけるのに苦労しています。アプリの他のユーザーとのチャット (マイナーな機能) のみを目的としたサブページであるため、階層の最上部にのみ表示されます。
私はすでにインストゥルメントを使用してみましたが、私が見つけることができる唯一の情報は、保持の原因が UIKit - UIClassSwapper からの 1 つのカウントであるということです。これはあまり意味がありません。
コントローラー内で次を使用します。
- Realm - チャット履歴をローカルに保存
- Socket IO - メッセージのリアルタイム送受信
- UITableView+delegate - メッセージの表示
- UITextView+delegate - 入力メッセージ
- NotificationCenter - キーボードが表示/非表示になり、アプリがバックグラウンド/フォアグラウンドに入るときの動作
カスタム デリゲートは使用されず、self への明示的な強い参照がこのコントローラー内で使用されます。チャット バブルには、レイヤーを追加するカスタム描画コードがありますが、他のビューからの参照は必要ありません。
View Controller が保持される原因は何ですか?
これは、保持されている各ビュー コントローラーによってソケットがサーバーから送信されたイベントに応答するようになるため重要です。しばらくすると、各ユーザーが複数としてカウントされます。
コードの特定の部分がこの問題を引き起こす可能性が高いかどうかを言及してください。質問に追加します。View Controller全体は400行を超えるコードであり、私の質問に完全に含めることは現実的ではありません.
編集
inokey さんの提案を受けて、各部分を分解してデバッグしたところ、リテイン サイクルの原因は実際には Socket IO でした。removeAllHandlers()
また、Socket IO のドキュメントを読み直したところ、強い参照サイクルが発生する可能性のあるすべての参照を削除する方法があることがわかりました。
ドキュメントを注意深く読まなかったのは私の間違いです -.-
ios - NSMapTable の仕組み
私は NSMapTable がどのように機能するかを理解しようとしています。だから私は遊び場で次のコードを試しています:
ドキュメントに書かれているように:「オブジェクトの1つが回収されたときにエントリが削除されるように、キーや値はオプションで「弱く」保持されます。
rob の割り当てが解除されたときにキーと値のペアへの弱い参照を持つようにオブジェクトを初期化したにもかかわらず、hobyePerson にまだ要素があるのはなぜですか?