最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

背景

項(xiàng)目中使用了WKWebView替換了之前的UIWebView,牽扯到Hybird開(kāi)發(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通過(guò)message handler的方式來(lái)調(diào)用OC的兩個(gè)方法。

這時(shí),就已經(jīng)發(fā)生了隱患,因?yàn)?/p>

[userContentController addScriptMessageHandler:self name:GetKeyiOSAndroid_Action];

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

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

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

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

解決方案:

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

嘗試1:

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

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

嘗試2:

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

[_webView.configuration.userContentController removeAllUserScripts];

這算一個(gè)腦抽的嘗試,看文檔說(shuō)明就懂了。自行略過(guò)

嘗試3:

不在初始化時(shí)添加ScriptMessageHandler, 而是和Notificenter/KVC一個(gè)思路

- (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的時(shí)候很多blog的內(nèi)容都只是說(shuō)了怎么添加Message Handler 但是并沒(méi)有高速大家有這個(gè)內(nèi)存泄漏的風(fēng)險(xiǎn),如果你只是頁(yè)面內(nèi)的數(shù)據(jù)調(diào)用你壓根都不會(huì)發(fā)現(xiàn)這個(gè)問(wèn)題。

此坑已填!

總結(jié)

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

相關(guān)文章

  • iOS實(shí)現(xiàn)懸浮按鈕

    iOS實(shí)現(xiàn)懸浮按鈕

    這篇文章主要為大家詳細(xì)介紹了iOS實(shí)現(xiàn)懸浮按鈕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • iOS 11 下適配UITableView 問(wèn)題

    iOS 11 下適配UITableView 問(wèn)題

    這篇文章主要介紹了iOS 11 下適配UITableView 問(wèn)題,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2017-09-09
  • iOS輕點(diǎn)、觸摸和手勢(shì)代碼開(kāi)發(fā)

    iOS輕點(diǎn)、觸摸和手勢(shì)代碼開(kāi)發(fā)

    這篇文章主要為大家詳細(xì)介紹了iOS輕點(diǎn)、觸摸和手勢(shì)代碼開(kāi)發(fā),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • iOS自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的幾種情況

    iOS自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的幾種情況

    這篇文章主要給大家介紹了關(guān)于iOS自定義轉(zhuǎn)場(chǎng)動(dòng)畫(huà)的幾種情況,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)各位iOS開(kāi)發(fā)者們具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • iOS調(diào)用高德地圖SDK的完整步驟

    iOS調(diào)用高德地圖SDK的完整步驟

    高德LBS開(kāi)放平臺(tái)將高德最專業(yè)的定位、地圖、搜索、導(dǎo)航等能力,以API、SDK等形式向廣大開(kāi)發(fā)者免費(fèi)開(kāi)放,下面這篇文章主要給大家介紹了關(guān)于iOS調(diào)用高德地圖SDK的完整步驟,需要的朋友可以參考下
    2021-11-11
  • 詳解Swift 之clipped是什么如何用

    詳解Swift 之clipped是什么如何用

    這篇文章主要介紹了詳解Swift 之clipped是什么如何用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-01-01
  • iOS監(jiān)聽(tīng)手機(jī)鎖屏狀態(tài)

    iOS監(jiān)聽(tīng)手機(jī)鎖屏狀態(tài)

    iPhone的鎖屏監(jiān)測(cè)分為兩種方式監(jiān)聽(tīng),本文給大家介紹的非常詳細(xì),具體內(nèi)容詳情大家通過(guò)本文詳細(xì)了解下吧
    2017-05-05
  • iOS使用WKWebView加載HTML5不顯示屏幕寬度的問(wèn)題解決

    iOS使用WKWebView加載HTML5不顯示屏幕寬度的問(wèn)題解決

    這篇文章主要介紹了iOS使用WKWebView加載HTML5不顯示屏幕寬度的問(wèn)題解決,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-12-12
  • iOS開(kāi)發(fā)之WKWebViewJavascriptBridge Xcode9中導(dǎo)致crash的解決

    iOS開(kāi)發(fā)之WKWebViewJavascriptBridge Xcode9中導(dǎo)致crash的解決

    大家都知道WebViewJavascriptBridge它主要幫助我們優(yōu)雅的實(shí)現(xiàn)OC與JS的交互,下面這篇文章主要給大家介紹了關(guān)于iOS開(kāi)發(fā)之WKWebViewJavascriptBridge Xcode9中導(dǎo)致crash的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。
    2017-10-10
  • iOS關(guān)閉虛擬鍵盤(pán)方法匯總

    iOS關(guān)閉虛擬鍵盤(pán)方法匯總

    在iOS應(yīng)用開(kāi)發(fā)中,有三類視圖對(duì)象會(huì)打開(kāi)虛擬鍵盤(pán),進(jìn)行輸入操作,但如何關(guān)閉虛擬鍵盤(pán),卻沒(méi)有提供自動(dòng)化的方法
    2016-04-04

最新評(píng)論

德令哈市| 南郑县| 潼南县| 富川| 临海市| 车致| 从化市| 陆川县| 峡江县| 兴隆县| 万山特区| 饶河县| 南京市| 鹿邑县| 沛县| 纳雍县| 顺昌县| 扎兰屯市| 三穗县| 怀宁县| 阳曲县| 安义县| 屏山县| 巴彦县| 阜阳市| 淮南市| 黄大仙区| 开江县| 曲水县| 奉节县| 芦山县| 高密市| 焦作市| 阿拉尔市| 武平县| 溧阳市| 江津市| 桐城市| 宁都县| 荥经县| 全椒县|