最近項(xiàng)目中需要混合開發(fā),加載H5頁面币厕,比較UIWebView與WKWebView,WK還是不錯(cuò)的列另,果斷試手,碰見一些坑旦装,例如本文中說的內(nèi)存溢出页衙,OC中是dealloc方法沒有執(zhí)行,swift中析構(gòu)函數(shù)deinit沒有執(zhí)行,搜了幾篇文章阴绢,多謝糊涂貓until大大的文章店乐,stackoverflow上的文章,大致原因就是下面這段代碼呻袭,ScriptMessageHandler的代理為當(dāng)前控制器眨八,導(dǎo)致無法釋放。
OC
1.參考幾篇文章,第一種解決方案是在頁面消失后篓足,移除ScriptMessageHandler的代理段誊,以下是代碼。
寫完之后就會發(fā)現(xiàn)dealloc方法已經(jīng)調(diào)用了纷纫。
2. 第二種方法枕扫,比第一種麻煩一點(diǎn),就是需要對代理進(jìn)行弱引用辱魁,怎么做呢烟瞧? 新建類LeakAvoider 繼承NSObject,遵守WKScriptMessageHandler協(xié)議 ?下面是代碼
有了這個(gè)類之后 诗鸭,就是在viewController中調(diào)用了,很簡單参滴!下面是用法
OK,寫完之后强岸,運(yùn)行,發(fā)現(xiàn) 的dealloc正常執(zhí)行了砾赔,如果控制器中對WKWebView進(jìn)行進(jìn)度條 標(biāo)題蝌箍、加載狀態(tài)進(jìn)行監(jiān)聽的話,需要在dealloc中移除監(jiān)聽暴心。OK妓盲,OC版的已經(jīng)結(jié)束了,下面是swift版本解決方案专普。
swift版
1.同OC一樣? 在viewcontroller的頁面消失后悯衬,需要移除移除ScriptMessageHandler的代理,做法在下面代碼中展示檀夹。
寫完之后筋粗,deinit就可以執(zhí)行了。
第二種方案炸渡,同樣是創(chuàng)建新類娜亿,繼承NSObject ,遵守WKScriptMessageHandler,下面是代碼
寫完之后就是用法蚌堵,直接上代碼
寫完之后deinit析構(gòu)函數(shù)就可以正常執(zhí)行了买决,結(jié)束。
第一次在簡書寫文章吼畏,寫的不是很熟練策州,加上這個(gè)功能也很普通,只是練練手宫仗,里面的代碼一些事直接copy過來,不要在意這些細(xì)節(jié)旁仿,在接下的文章中會寫WKWebView的緩存的坑藕夫,清理緩存,并且會寫OC與JS交互枯冈,互傳數(shù)據(jù)毅贮,包括webViewjavaScriptBridge的使用,希望給大家?guī)韼椭?/p>