1

View Controller が解放されない原因を見つけるのに苦労しています。アプリの他のユーザーとのチャット (マイナーな機能) のみを目的としたサブページであるため、階層の最上部にのみ表示されます。

私はすでにインストゥルメントを使用してみましたが、私が見つけることができる唯一の情報は、保持の原因が UIKit - UIClassSwapper からの 1 つのカウントであるということです。これはあまり意味がありません。

ここに画像の説明を入力

コントローラー内で次を使用します。

  1. Realm - チャット履歴をローカルに保存
  2. Socket IO - メッセージのリアルタイム送受信
  3. UITableView+delegate - メッセージの表示
  4. UITextView+delegate - 入力メッセージ
  5. NotificationCenter - キーボードが表示/非表示になり、アプリがバックグラウンド/フォアグラウンドに入るときの動作

カスタム デリゲートは使用されず、self への明示的な強い参照がこのコントローラー内で使用されます。チャット バブルには、レイヤーを追加するカスタム描画コードがありますが、他のビューからの参照は必要ありません。

View Controller が保持される原因は何ですか?

これは、保持されている各ビュー コントローラーによってソケットがサーバーから送信されたイベントに応答するようになるため重要です。しばらくすると、各ユーザーが複数としてカウントされます。

コードの特定の部分がこの問題を引き起こす可能性が高いかどうかを言及してください。質問に追加します。View Controller全体は400行を超えるコードであり、私の質問に完全に含めることは現実的ではありません.

編集

inokey さんの提案を受けて、各部分を分解してデバッグしたところ、リテイン サイクルの原因は実際には Socket IO でした。removeAllHandlers()また、Socket IO のドキュメントを読み直したところ、強い参照サイクルが発生する可能性のあるすべての参照を削除する方法があることがわかりました。

ドキュメントを注意深く読まなかったのは私の間違いです -.-

4

2 に答える 2

1

Socket Client や Realm Client のような多くの外部のものを使用する場合、これらの人からいくつかの強力な参照が得られる可能性が非常に高くなります。問題が保持サイクルの原因である場合、いくつかのアプローチを試すことができると思います。

初め。元の MVC パターンの VC に実際に属してはならないものを 1 つずつ削除してみてください。それは明らかにソケットとレルムです。理想的には、それらはある種のサービスにカプセル化され、サービスによって使用される必要があります。VC から直接ではありません。

2番。これらのオブジェクトが初期化解除されているかどうかを確認してください。deinit()それらにメソッドを追加することでそれを行うことができます。

三番。上記の両方に由来するものは次のとおりです。これらのものをどのように初期化しますか?という質問に答えてみてください。

申し訳ありませんが、これ以上具体的に言えませんが、これが正しい考えにつながることを願っています.

于 2017-08-04T07:24:26.713 に答える