国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - IOS - iOS WKWebView中MessageHandler內(nèi)存泄漏問題的完美解決過程

iOS WKWebView中MessageHandler內(nèi)存泄漏問題的完美解決過程

2021-05-05 21:48Jsen_Wang IOS

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

背景

項目中使用了wkwebview替換了之前的uiwebview,牽扯到hybird開發(fā),我們需要和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的方式來調(diào)用oc的兩個方法。

這時,就已經(jīng)發(fā)生了隱患,因為

[usercontentcontroller addscriptmessagehandler:self name:getkeyiosandroid_action];

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

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

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

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

解決方案:

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

嘗試1:

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

思路效仿block , 結(jié)果失敗

嘗試2:

在viewwilldisappear / viewdiddisappear 生命周期方法中調(diào)用

?
1
[_webview.configuration.usercontentcontroller removealluserscripts];

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

iOS WKWebView中MessageHandler內(nèi)存泄漏問題的完美解決過程

嘗試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];
}

結(jié)果成功

小結(jié):

之前在使用wkwebview的時候很多blog的內(nèi)容都只是說了怎么添加message handler 但是并沒有高速大家有這個內(nèi)存泄漏的風(fēng)險,如果你只是頁面內(nèi)的數(shù)據(jù)調(diào)用你壓根都不會發(fā)現(xiàn)這個問題。

此坑已填!

總結(jié)

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 亚洲欧美综合精品久久成人 | 亚洲午夜视频 | 毛片视频网站在线观看 | 国产区视频 | 一本一道久久久a久久久精品91 | 亚洲精品视频国产 | av在线一区二区 | 久久99精品久久久久久水蜜桃 | 国产精品美女久久久久久久网站 | 欧美wwwsss9999| 黄色av网 | 亚洲国产视频一区二区 | 日韩在线欧美 | 国产麻豆一区二区三区 | 欧美久久久久 | 午夜在线小视频 | 久久丁香 | 自拍偷拍欧美 | 国产一区二区三区在线 | 国产日产久久高清欧美一区 | 99久久99| 国产超碰人人爽人人做人人爱 | 日韩一二三| 亚洲福利精品 | 中文字幕久久久 | 久久se精品一区精品二区 | 亚洲人成网亚洲欧洲无码 | 天天综合7799精品影视 | 久久久久国产精品 | 亚洲在线影院 | 在线观看日韩精品 | 天天爱天天草 | 国产精品美女www爽爽爽软件 | 日韩国产欧美精品 | 国产亚洲精品美女久久久久久久久久 | 日本福利一区二区 | 精品九九| 极品videossex中国妞hd | 精品一区二区三区在线视频 | 亚洲激情精品 | 中文字幕日韩欧美 |