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


関連記事

swift

[Swift3] ScrollViewを使ってみた!

1 はじめに2 縦スクロール3 横スクロール4 横スライドでページング5 さいごに6 おすすめ書籍 はじめに どーもはじめです。 ずっと苦手意識というかあまり使いたくないイメージを持っていたのですが、 ...

【Swift】SwiftUIの理解のためDSL記法とFunctionBuilderを調べてみた

1 はじめに2 DSL(ドメイン固有言語)について3 関数ビルダ3.1 定義方法3.2 使用方法3.3 SwiftUIの関数ビルダ4 カスタム属性5 さいごに6 おすすめ書籍 はじめに Xcode11 ...

swift

SwiftでPDFを表示する(iOS11以前対応版)

1 はじめに1.1 前提条件2 実装3 さいごに はじめに こんにちは、nukkyです。 SwiftでPDFを表示したい場合iOS11以降ならPDFKitがありますが、自分の様にまだ11以前のOSにも ...

UnityのiOSネイティブをSwiftで書く

1 はじめに2 UnityのiOSネイティブとは?3 今回作るもの4 必要な構成5 unity-swiftの導入6 必要な機能の実装6.1 Swiftクラスの作成6.2 Objective-C++でU ...

Xcode11のデバッグ機能

1 はじめに2 Device Conditions2.1 Thermal state condition2.2 Network link condition3 Environment Override ...

フォロー

blog-page_side_responsive

2022年3月
 12345
6789101112
13141516171819
20212223242526
2728293031  

アプリ情報

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