おすすめ書籍はじめにこんにちは、suzukiです。この記事の結論は2点あります。AlertControllerが悪いわけではなく実装が悪かった。Graphは便利!の2点です。記事の内容自体はアンチパターンとでも思っていただければ幸いです。Graphを使用することを考えていこうというだけです。今回の発症した問題の詳細は割愛させていただきますが、消したはずの画面が通知を受け取っているようなログが表示されていました。アプリとしては問題ない遷移と動作がおこなわれていたため気づかず開発をしていました。ある時ログに気づいてしまったため原因を調べていきました。deinitの調査しばらく調べた結果、念のためdeinitが呼ばれていないのではと疑い、deinitにBreakPointとprint()を記述してみたところ見事に呼ばれていませんでした。便利ですね、deinit、、、、通知の解除を行うコードはここに書かれていたため呼ばれていないことが確定。//通知のオブザーバーの解除とか諸々の処理、、、、、呼ばれていない。{print("deinit")//通知のオブザーバーの解除とか諸々の処理、、、、、呼ばれていない。}原因の調査deinitが毎回呼ばれないということは何か明確な問題があるはずと思い。コードをどんどんコメントアウトしていきました。不幸にもWKWebViewがある画面でDelegateまみれで全部疑わしく見えていました。地道に確認したところWebViewのJavaScriptのアラートを表示するコードを削除したら、deinitが呼ばれました。今回問題となった箇所を抜き出すと下記のようなコードとなります。//ハンドラ自体にViewControllerを渡さずクロージャで表示を行う。//クロージャに作成したアラートを渡す。nil}//ハンドラ自体にViewControllerを渡さずクロージャで表示を行う。incompletionHandler()}alertController.addAction(otherAction)//クロージャに作成したアラートを渡す。//通知のオブザーバーの解除とか諸々の処理、、、、、呼ばれていない。{print("deinit")//通知のオブザーバーの解除とか諸々の処理、、、、、呼ばれていない。}}解決策ここだけ見ると問題は単純で循環参照が起きてました。self]を記述することにより循環参照が解消されます。Graphが便利だと聞きました。循環参照の検知はできたりできなったりですが、インスタンスが破棄されていないことなどは一目でわかります。問題が起きている状態で試しに動かしたところ下記のようになりました。プロジェクトをある程度動作させた後にやってみたら、気づかなかったメモリーリークが見つかるかもしれません。一度使ってみてください。さいごにXCodeで普段使っていないけど便利な機能はたくさんあるのだと再確認できました。便利なツールを使っているので、有効的に使っていけるよう、今一度XCodeの機能を再確認していきたいです。コメントをキャンセルメールアドレスが公開されることはありません。コメント名前メールアドレスサイト上に表示された文字を入力してください。はじめまして、Yossyです。私たちは無料アプリもリリースしています、ぜひご覧ください。下記のアイコンから無料でダウンロードできます。