激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - IOS - iOS WKWebView中MessageHandler內存泄漏問題的完美解決過程

iOS WKWebView中MessageHandler內存泄漏問題的完美解決過程

2021-05-05 21:48Jsen_Wang IOS

這篇文章主要給大家介紹了關于iOS WKWebView中MessageHandler內存泄漏問題的完美解決過程,文中通過示例代碼介紹的非常詳細,對各位iOS開發者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

背景

項目中使用了wkwebview替換了之前的uiwebview,牽扯到hybird開發,我們需要和h5交互,所以用到了wkwebviewconfiguration 中的 wkusercontentcontroller

所以初始化代碼如下

?
1
2
3
4
5
6
7
8
9
10
11
wkusercontentcontroller *usercontentcontroller = [[wkusercontentcontroller alloc] init];
[usercontentcontroller addscriptmessagehandler:self name:getkeyiosandroid_action];
[usercontentcontroller addscriptmessagehandler:self name:upload_action];
 
// wkwebview的配置
wkwebviewconfiguration *configuration = [[wkwebviewconfiguration alloc] init];
configuration.usercontentcontroller = usercontentcontroller;
 
_webview = [[wkwebview alloc] initwithframe:cgrectzero configuration:configuration];
_webview.navigationdelegate = self;
_webview.uidelegate = self;

getkeyiosandroid_action upload_action 分別是h5通過message handler的方式來調用oc的兩個方法。

這時,就已經發生了隱患,因為

[usercontentcontroller addscriptmessagehandler:self name:getkeyiosandroid_action];

這里usercontentcontroller持有了self ,然后 usercontentcontroller 又被configuration持有,最終唄webview持有,然后webview是self的一個私有變量,所以self也持有self,所以,這個時候有循環引用的問題存在,導致界面被pop或者dismiss之后依然會存在內存中。不會被釋放

當然如果你只是靜態界面,或者與h5的交互的內容僅限于本頁面內的內容,其實只是單純的內存泄漏,但是,如果此時和h5的交互方法中牽扯到全局變量,或者全局的一些內容,那么就不可控制了。

我發現這個問題是因為我們web頁面會監聽token過期的和登錄狀態改變的通知,然后會刷新界面,并且重新發送請求,這一系列動作中會和用戶的全局信息進行交互,所以在訪問一個web頁面后,切換賬號登錄時會發現有之前訪問過的web頁面請求發出,并且因為token不同報了token過期的錯誤,所以導致登錄后誤操作為token過期,緊接著被踢到登錄界面。

通過charles抓包發現,這些web頁面都是在切換登錄賬號欠訪問的所有界面,所以,鎖定問題時web頁面依舊存在,在切換登錄后收到了登錄狀態改變的通知,重新刷新了界面導致請求發出并返回報錯,進而出現登錄后被踢出的bug。

解決方案:

既然是循環引用,那么必須破除一邊的強引用,改為弱引用,或者直接去除引用。思路明朗了。。

嘗試1:

?
1
2
3
id __weak weakself = self;
wkusercontentcontroller *usercontentcontroller = [[wkusercontentcontroller alloc] init];
[usercontentcontroller addscriptmessagehandler:weakself name:getkeyiosandroid_action];

思路效仿block , 結果失敗

嘗試2:

在viewwilldisappear / viewdiddisappear 生命周期方法中調用

?
1
[_webview.configuration.usercontentcontroller removealluserscripts];

這算一個腦抽的嘗試,看文檔說明就懂了。自行略過

iOS WKWebView中MessageHandler內存泄漏問題的完美解決過程

嘗試3:

不在初始化時添加scriptmessagehandler, 而是和notificenter/kvc一個思路

?
1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)viewwillappear:(bool)animated {
 [super viewwillappear:animated];
 
 [_webview.configuration.usercontentcontroller addscriptmessagehandler:self name:getkeyiosandroid_action];
 [_webview.configuration.usercontentcontroller addscriptmessagehandler:self name:upload_action];
}
 
- (void)viewwilldisappear:(bool)animated {
 [super viewwilldisappear:animated];
 
 [_webview.configuration.usercontentcontroller removescriptmessagehandlerforname:getkeyiosandroid_action];
 [_webview.configuration.usercontentcontroller removescriptmessagehandlerforname:upload_action];
}

結果成功

小結:

之前在使用wkwebview的時候很多blog的內容都只是說了怎么添加message handler 但是并沒有高速大家有這個內存泄漏的風險,如果你只是頁面內的數據調用你壓根都不會發現這個問題。

此坑已填!

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對服務器之家的支持。

原文鏈接:https://blog.csdn.net/wxs0124/article/details/78402596

延伸 · 閱讀

精彩推薦
  • IOSiOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果

    這篇文章主要介紹了iOS自定義UICollectionViewFlowLayout實現圖片瀏覽效果的相關資料,需要的朋友可以參考下...

    jiangamh8882021-01-11
  • IOS詳解iOS中多個網絡請求的同步問題總結

    詳解iOS中多個網絡請求的同步問題總結

    這篇文章主要介紹了詳解iOS中多個網絡請求的同步問題總結,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧...

    liang199111312021-03-15
  • IOSiOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)

    iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和

    這篇文章主要介紹了iOS中滑動控制屏幕亮度和系統音量(附加AVAudioPlayer基本用法和Masonry簡單使用)的相關資料,需要的朋友可以參考下...

    CodingFire13652021-02-26
  • IOSiOS開發之視圖切換

    iOS開發之視圖切換

    在iOS開發中視圖的切換是很頻繁的,獨立的視圖應用在實際開發過程中并不常見,除非你的應用足夠簡單。在iOS開發中常用的視圖切換有三種,今天我們將...

    執著丶執念5282021-01-16
  • IOSiOS實現控制屏幕常亮不變暗的方法示例

    iOS實現控制屏幕常亮不變暗的方法示例

    最近在工作中遇到了要將iOS屏幕保持常亮的需求,所以下面這篇文章主要給大家介紹了關于利用iOS如何實現控制屏幕常亮不變暗的方法,文中給出了詳細的...

    隨風13332021-04-02
  • IOSiOS中UILabel實現長按復制功能實例代碼

    iOS中UILabel實現長按復制功能實例代碼

    在iOS開發過程中,有時候會用到UILabel展示的內容,那么就設計到點擊UILabel復制它上面展示的內容的功能,也就是Label長按復制功能,下面這篇文章主要給大...

    devilx12792021-04-02
  • IOSiOS開發技巧之狀態欄字體顏色的設置方法

    iOS開發技巧之狀態欄字體顏色的設置方法

    有時候我們需要根據不同的背景修改狀態欄字體的顏色,下面這篇文章主要給大家介紹了關于iOS開發技巧之狀態欄字體顏色的設置方法,文中通過示例代碼...

    夢想家-mxj8922021-05-10
  • IOSiOS中MD5加密算法的介紹和使用

    iOS中MD5加密算法的介紹和使用

    MD5加密是最常用的加密方法之一,是從一段字符串中通過相應特征生成一段32位的數字字母混合碼。對輸入信息生成唯一的128位散列值(32個字符)。這篇文...

    LYSNote5432021-02-04
主站蜘蛛池模板: 在线香蕉视频 | 羞羞网站在线看 | 成人免费看视频 | 91精品成人福利在线播放 | 欧美日韩a∨毛片一区 | 一区二区三区四区免费看 | 久久精品99北条麻妃 | 日日夜av| 成人福利在线免费观看 | 51色视频 | 国产精品99久久久久久宅女 | 在线播放亚洲视频 | 青热久思思 | 久久久激情网 | 大学生一级毛片在线视频 | 精品一区二区三区网站 | 91成人免费视频 | 韩国草草影院 | 奶子吧naiziba.cc免费午夜片在线观看 | 牛牛a级毛片在线播放 | 美国一级黄色毛片 | 久久精品99久久久久久2456 | 女人裸体让男人桶全过程 | 色交视频| 法国性xxx精品hd专区 | 国产毛毛片一区二区三区四区 | 国产一区二区三区视频在线 | 中国免费一级毛片 | 日韩欧美电影一区二区三区 | 中文字幕在线观看免费视频 | 精品一区二区三区中文字幕老牛 | 亚洲精品 在线播放 | 72pao成人国产永久免费视频 | 午夜视频在线在免费 | 黄色免费播放网站 | 成人在线视频免费看 | 午夜视频在线免费播放 | 欧美18一19sex性护士农村 | 久久久线视频 | 3344永久免费| 国产一区精品在线观看 |