亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

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

2019-10-21 18:40:22
字體:
來源:轉載
供稿:網友

背景

項目中使用了WKWebView替換了之前的UIWebView,牽扯到Hybird開發,我們需要和H5交互,所以用到了WKWebViewConfiguration 中的 WKUserContentController

所以初始化代碼如下

  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:

id __weak weakSelf = self;WKUserContentController *userContentController = [[WKUserContentController alloc] init];[userContentController addScriptMessageHandler:weakSelf name:GetKeyiOSAndroid_Action];

思路效仿block , 結果失敗

嘗試2:

在viewWillDisappear / viewDidDisappear 生命周期方法中調用

[_webView.configuration.userContentController removeAllUserScripts];

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

iOS,WKWebView,MessageHandler,內存泄漏

嘗試3:

不在初始化時添加ScriptMessageHandler, 而是和Notificenter/KVC一個思路

- (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 但是并沒有高速大家有這個內存泄漏的風險,如果你只是頁面內的數據調用你壓根都不會發現這個問題。

此坑已填!

總結

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


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲一区中文字幕在线观看| 久久91精品国产91久久久| 亚洲精品日韩欧美| 国产91精品在线播放| 亚洲激情免费观看| 国产亚洲a∨片在线观看| 国产精品久久久久久久久| 97在线观看免费| 精品久久久999| 美女扒开尿口让男人操亚洲视频网站| 国产精品一二区| 日韩一区二区三区xxxx| 欧美成人免费在线观看| 欧洲成人午夜免费大片| 国产欧美日韩亚洲精品| 久久久久久国产精品美女| 欧美富婆性猛交| 国产成人久久精品| 久久av资源网站| 成人h片在线播放免费网站| 中文字幕日韩在线观看| 欧美激情亚洲另类| 亚洲欧洲一区二区三区在线观看| 欧美一级免费看| 亚洲黄色有码视频| 国产精品久久久久久久久久ktv| 午夜精品久久久久久99热软件| 色婷婷综合久久久久中文字幕1| 午夜精品在线观看| 亚洲大胆人体在线| 深夜福利国产精品| 成人在线播放av| 久久成人一区二区| 久久精品小视频| 中文字幕欧美亚洲| 欧美人与性动交a欧美精品| 国产精品爽爽爽| 91色琪琪电影亚洲精品久久| 91香蕉嫩草神马影院在线观看| 综合欧美国产视频二区| 精品视频在线播放色网色视频| 欧美亚洲日本网站| 国产激情视频一区| 亚洲欧美日韩区| 亚洲精品美女在线观看播放| 第一福利永久视频精品| 亚洲国产欧美精品| 中文字幕亚洲一区| 国内精品久久久久伊人av| 国产精品成人一区二区三区吃奶| 亚洲一区二区久久久久久久| 成人欧美一区二区三区在线湿哒哒| 国产精品成人国产乱一区| 亚洲偷欧美偷国内偷| 中文字幕亚洲图片| 日韩中文字幕精品视频| 欧美日韩国产一区在线| 国产精品色午夜在线观看| 91美女福利视频高清| 亚洲免费av片| 亚洲视频在线观看视频| 亚洲激情第一页| 日本精品视频在线播放| 亚洲国产美女精品久久久久∴| 久久久久久久久久久久久久久久久久av| 亚洲女性裸体视频| 成人妇女淫片aaaa视频| 日韩欧美精品网址| 欧美成人黄色小视频| 另类专区欧美制服同性| 欧美另类69精品久久久久9999| 亚洲天堂av网| 国产日韩中文字幕| 欧亚精品在线观看| 狠狠做深爱婷婷久久综合一区| 欧美丝袜一区二区| 亚洲精品自产拍| 亚洲午夜国产成人av电影男同| 91精品国产91久久久久久最新| 欧美日韩在线第一页| 亚洲国内高清视频| 亚洲欧美自拍一区| 夜夜狂射影院欧美极品| 日本久久久久久久久久久| 日本aⅴ大伊香蕉精品视频| 国产精品扒开腿做爽爽爽的视频| 正在播放亚洲1区| 欧美一区二区大胆人体摄影专业网站| 亚洲激情视频在线播放| 亚洲成年人在线播放| 538国产精品一区二区免费视频| 久久99热这里只有精品国产| 亚洲国产精品推荐| 国产精品视频一区二区三区四| 亚洲999一在线观看www| 国产成人一区三区| 国产精品一久久香蕉国产线看观看| 川上优av一区二区线观看| 国产一区私人高清影院| 亚洲性夜色噜噜噜7777| 欧美日韩中文字幕| 色中色综合影院手机版在线观看| 日韩av成人在线观看| 在线丨暗呦小u女国产精品| 91免费高清视频| 超碰精品一区二区三区乱码| 国产久一一精品| 亚洲精品91美女久久久久久久| 欧美丝袜第一区| 亚洲电影中文字幕| 午夜精品久久久99热福利| 久久综合色影院| 国产成人自拍视频在线观看| 91久久精品一区| 亚洲精品中文字幕有码专区| 欧美日在线观看| 欧美极品xxxx| 九九热视频这里只有精品| 成人看片人aa| 国产狼人综合免费视频| 国产精品扒开腿爽爽爽视频| 国产精品91久久久| 欧美电影免费看| 中文字幕久精品免费视频| 久久精品视频在线观看| 亚洲欧美成人精品| 98午夜经典影视| 日韩精品高清在线| 91九色单男在线观看| 国内精品久久久久| 日韩av黄色在线观看| 北条麻妃一区二区在线观看| 欧美日韩免费在线| 中文字幕精品一区久久久久| 国产精品久久久久久久久久99| 国产成人精品日本亚洲| 亚洲福利小视频| 国产精品扒开腿做| 亚洲免费电影一区| 91精品国产高清| 中文字幕欧美视频在线| 欧美综合激情网| 欧美高清自拍一区| 色噜噜亚洲精品中文字幕| 日韩精品视频在线观看网址| 精品久久久一区二区| 81精品国产乱码久久久久久| 亚洲国产精久久久久久| 亚洲天堂av女优| 亚洲自拍av在线| 亚洲欧美精品一区二区| 亚洲自拍高清视频网站| 国产精品精品一区二区三区午夜版| 色综合伊人色综合网| 欧美性69xxxx肥| 精品露脸国产偷人在视频| 国产精品久久久久久影视| 亚洲电影免费观看高清完整版在线| 成人国产精品免费视频| 中文字幕日韩欧美在线视频| 奇门遁甲1982国语版免费观看高清| 亚洲iv一区二区三区| 日韩国产在线看| 精品一区二区三区电影|