iOS

【Swift】WKWebViewのWKUserContentControllerで循環参照

投稿日:

はじめに

こんにちはsuzukiです。今回はwebviewのWKUserContentControllerで起きた循環参照について、備忘もかねて触れていこうと思います。
先に結論から言うとaddしたらremoveしましょうです。
循環参照が起きて実害が起きるまでなかなか気付かないのですが、webView関係は実害が起こりやすい+起こるような実装をしがちな印象があります。

循環参照が起きた原因

WKUserContentControllerを利用してweb側とアプリ側でやりとりをすることができます。
例えばwebで設定したアラートをアプリでダイアログ表示などするとか、web側のイベントを検知し、アプリ側でハンドリングしUIAlertControllerを使うのようなことが可能です。

実装

WKUserContentControllerfunc add(WKScriptMessageHandler, name: String)でjsからメッセージが送られてきた場合のハンドリング先を設定できます。

上記のコードでは”alertAction”と言う名前でwebからメッセージを受け取ったら、下記の関数がよばれます。
func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage)

またweb側ではwebkit.messageHandlers.alertAction.postMessage()で上記のメッセージを呼ぶことが可能です。

実装の問題の箇所

今回のコードは設定した内容は問題なく動くのですが、func add(WKScriptMessageHandler, name: String)でselfを渡してしまっているので、循環参照が起きてしまいます。

上記のようにdeinitを記述してもよばれることはありません。
画面を閉じる処理を読んでもメモリリークが発生しインスタンスの破棄が行われなくなってしまいます。

修正方法

結論でも言いましたが、addした内容はremoveしましょう。func removeScriptMessageHandler(forName name: String)を呼ぶことで設定を削除できます。

さいごに

WebView関連では循環参照による不具合がよく起きがちです。しかも検知するのが、アプリではなくweb側だったりするので、調査に苦労します。問題を未然に防ぐためにも変なWebViewのインスタンスは残さないようにしていきましょう。

おすすめ書籍

[改訂新版]Swift実践入門 ── 直感的な文法と安全性を兼ね備えた言語 WEB+DB PRESS plus 詳解 Swift 第4版 [改訂新版]Swiftポケットリファレンス (POCKET REFERENCE)

blog-page_footer_336




blog-page_footer_336




-iOS
-

執筆者:


comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

[初心者向け]続・Xcodeの使い方(よく使うショートカットキーとエディタ)

1 はじめに1.1 前提条件2 ショートカットキー2.1 定義に移動(Jump to Definition)2.2 Quick Help2.3 Rename2.4 Edit All in Scope2 ...

【SwiftUI】ドラッグ&ドロップでアプリ間の文字列の共有

1 はじめに2 ドラッグ&ドロップの実装3 ドラッグ側の実装4 ドロップ側の実装5 さいごに6 おすすめ書籍 はじめに こんにちはsuzukiです。今回はドラッグ&ドロップを利用し ...

swift

Swift3で動的にUIViewを切り替える Part2

1 はじめに1.1 前提条件2 完成イメージ3 StoryBoardの準備3.1 Viewの配置3.1.1 ① Segmentを配置するView3.1.2 ② ContainerViewを表示するVi ...

swift

Swift3 StoryBoard上でUIButtonやUILabel、UIViewのcornerを変更する

1 はじめに1.1 前提条件2 StoryBoardの準備3 カスタムクラスの作成3.1 class ~について3.2 @IBDesignableを記述すると3.2.1 Live Renderingと ...

swift

UITableViewでTableViewCell(Xib)を使ってみた

1 はじめに1.1 前提条件1.2 事前準備2 TableViewを準備3 Xibを準備4 tableviewに表示するcellにxibを指定する5 さいごに はじめに どうも、はじめです。 今回はX ...

フォロー

blog-page_side_responsive

2022年3月
 12345
6789101112
13141516171819
20212223242526
2728293031  

アプリ情報

私たちは無料アプリもリリースしています、ぜひご覧ください。 下記のアイコンから無料でダウンロードできます。