亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2018年07月13日 16:30:49   作者:Jsen_Wang  
這篇文章主要給大家介紹了關于iOS WKWebView中MessageHandler內(nèi)存泄漏問題的完美解決過程,文中通過示例代碼介紹的非常詳細,對各位iOS開發(fā)者們具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧

背景

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

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

[userContentController addScriptMessageHandler:self name:GetKeyiOSAndroid_Action];

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

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

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

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

解決方案:

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

嘗試1:

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

思路效仿block , 結果失敗

嘗試2:

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

[_webView.configuration.userContentController removeAllUserScripts];

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

嘗試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的內(nèi)容都只是說了怎么添加Message Handler 但是并沒有高速大家有這個內(nèi)存泄漏的風險,如果你只是頁面內(nèi)的數(shù)據(jù)調(diào)用你壓根都不會發(fā)現(xiàn)這個問題。

此坑已填!

總結

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

相關文章

  • IOS開發(fā)之多線程NSThiread GCD NSOperation Runloop

    IOS開發(fā)之多線程NSThiread GCD NSOperation Runloop

    這篇文章主要介紹了IOS多線程開發(fā),主要用到NSThiread、GCD、 NSOperation、Runloop,有詳細的原理解析和實例代碼,對多線程感興趣的同學,可以參考下
    2021-04-04
  • IOS數(shù)字鍵盤左下角添加完成按鈕的實現(xiàn)方法

    IOS數(shù)字鍵盤左下角添加完成按鈕的實現(xiàn)方法

    這篇文章主要介紹了IOS數(shù)字鍵盤左下角添加完成按鈕的實現(xiàn)方法的相關資料,希望通過本文能實現(xiàn)類似這樣的功能,需要的朋友可以參考下
    2017-08-08
  • IOS 開發(fā)之swift中UIView的擴展使用的實例

    IOS 開發(fā)之swift中UIView的擴展使用的實例

    這篇文章主要介紹了IOS 開發(fā)之swift中UIView的擴展使用的實例的相關資料,希望通過本文能幫助到大家,需要的朋友可以參考下
    2017-09-09
  • iOS將時間NSDate轉化為毫秒時間戳的方法示例

    iOS將時間NSDate轉化為毫秒時間戳的方法示例

    這篇文章主要給大家介紹了關于iOS將時間NSDate轉化為毫秒時間戳的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-08-08
  • iOS 高效的分頁加載實現(xiàn)示例

    iOS 高效的分頁加載實現(xiàn)示例

    本篇文章主要介紹了iOS 高效的分頁加載實現(xiàn)示例,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • IOS實現(xiàn)的簡單畫板功能

    IOS實現(xiàn)的簡單畫板功能

    本文主要介紹了IOS實現(xiàn)簡單畫板的示例代碼。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • 基于iOS實現(xiàn)圖片折疊效果

    基于iOS實現(xiàn)圖片折疊效果

    這篇文章主要為大家詳細介紹了基于iOS實現(xiàn)圖片折疊效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-07-07
  • 一行iOS代碼實現(xiàn)圖片無限輪播器

    一行iOS代碼實現(xiàn)圖片無限輪播器

    一行iOS代碼實現(xiàn)圖片無限輪播器的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • IOS實現(xiàn)簽到特效(散花效果)的實例代碼

    IOS實現(xiàn)簽到特效(散花效果)的實例代碼

    這篇文章主要介紹了IOS實現(xiàn)簽到特效(散花效果)的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • iOS 13適配匯總(推薦)

    iOS 13適配匯總(推薦)

    這篇文章主要介紹了iOS 13適配匯總,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-09-09

最新評論