ViewController中嵌入WKWebView,內(nèi)存溢出

最近項目中需要混合開發(fā),加載H5頁面,比較UIWebView與WKWebView,WK還是不錯的,果斷試手,碰見一些坑,例如本文中說的內(nèi)存溢出,OC中是dealloc方法沒有執(zhí)行,swift中析構(gòu)函數(shù)deinit沒有執(zhí)行,搜了幾篇文章,多謝糊涂貓until大大的文章,stackoverflow上的文章,大致原因就是下面這段代碼,ScriptMessageHandler的代理為當(dāng)前控制器,導(dǎo)致無法釋放。

下面是解決方案,分OC和swift版本都有,先來OC

OC

1.參考幾篇文章,第一種解決方案是在頁面消失后,移除ScriptMessageHandler的代理,以下是代碼。

寫完之后就會發(fā)現(xiàn)dealloc方法已經(jīng)調(diào)用了。

2. 第二種方法,比第一種麻煩一點,就是需要對代理進行弱引用,怎么做呢? 新建類LeakAvoider 繼承NSObject,遵守WKScriptMessageHandler協(xié)議 ?下面是代碼

.h文件內(nèi)容
.m文件內(nèi)容

有了這個類之后 ,就是在viewController中調(diào)用了,很簡單!下面是用法

OK,寫完之后,運行,發(fā)現(xiàn) 的dealloc正常執(zhí)行了,如果控制器中對WKWebView進行進度條 標(biāo)題、加載狀態(tài)進行監(jiān)聽的話,需要在dealloc中移除監(jiān)聽。OK,OC版的已經(jīng)結(jié)束了,下面是swift版本解決方案。

swift版

1.同OC一樣? 在viewcontroller的頁面消失后,需要移除移除ScriptMessageHandler的代理,做法在下面代碼中展示。

viewDiddisappear中代碼

寫完之后,deinit就可以執(zhí)行了。

第二種方案,同樣是創(chuàng)建新類,繼承NSObject ,遵守WKScriptMessageHandler,下面是代碼

swift中代碼

寫完之后就是用法,直接上代碼

控制器中用法

寫完之后deinit析構(gòu)函數(shù)就可以正常執(zhí)行了,結(jié)束。

第一次在簡書寫文章,寫的不是很熟練,加上這個功能也很普通,只是練練手,里面的代碼一些事直接copy過來,不要在意這些細節(jié),在接下的文章中會寫WKWebView的緩存的坑,清理緩存,并且會寫OC與JS交互,互傳數(shù)據(jù),包括webViewjavaScriptBridge的使用,希望給大家?guī)韼椭?/p>

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容