如果不知道如何集成flutter可以看我的上一篇文章《iOS老項(xiàng)目集成flutter最新混編方案》
集成flutter進(jìn)入項(xiàng)目后發(fā)現(xiàn)每次進(jìn)入flutter模塊都是導(dǎo)致內(nèi)存增加60M-80M并且退出flutter頁面后掸鹅,內(nèi)存并不會(huì)釋放秦驯,具體原因是由于每次進(jìn)入Flutter頁面都會(huì)創(chuàng)建新的的FlutterViewController,但退出的時(shí)候并沒有釋放务冕。
為什么google難以解決:
由于整個(gè)FlutterEngine是用MRC的方式編寫伤为,所以內(nèi)存管理比較困難,每個(gè)變量生成retain,都需要被release鞠眉,如果一個(gè)實(shí)例retain了兩次,只release一次择诈,也會(huì)導(dǎo)致無法釋放械蹋,如果設(shè)置了autorelease,就有可能提前釋放羞芍,導(dǎo)致badasses哗戈,訪問野指針。
客觀原因荷科,一般的應(yīng)用只會(huì)創(chuàng)建一個(gè)flutter應(yīng)用唯咬,或者干脆就直接都是flutter應(yīng)用,不釋放就不釋放畏浆,多點(diǎn)內(nèi)存也無所謂胆胰,不影響崩潰,不影響使用全度,所以google照常發(fā)布1.0版煮剧。
官方發(fā)布最新的解決方案,使用FlutterEngine初始化FlutterViewController
FlutterViewController *flutterViewController = [[FlutterViewControlleralloc]initWithEngine:flutterEnginenibName:nilbundle:nil];
通過類別發(fā)現(xiàn)将鸵,此方案確實(shí)使FlutterViewController釋放勉盅,但拒網(wǎng)上查詢資料得知google團(tuán)隊(duì)只是將內(nèi)存泄漏轉(zhuǎn)嫁到FlutterEngine對(duì)象上,并沒有徹底解決內(nèi)存問題顶掉,實(shí)踐發(fā)現(xiàn)草娜,每次打開Flutter頁面內(nèi)存會(huì)增長(zhǎng)不到1M左右,與之前暴漲的80M內(nèi)存相比痒筒,此方案還是在可接受范圍宰闰。
有大神徹底解決內(nèi)存泄漏的問題,通過自己修改frameword的方式簿透,有興趣的可以了解下相關(guān)文章移袍。傳送門
但是這個(gè)方案有個(gè)致命的缺陷,就是每次flutter升級(jí)都需要下載最新的frameword文件老充,對(duì)于沒有能力自己編寫frameword文件的同學(xué)葡盗,我更加傾向于官方的解決方案,不到1M的內(nèi)存泄漏還是在可以接受的范圍內(nèi)的啡浊。
官方方案:
但是觅够,使用官方解決方案發(fā)現(xiàn)我們想通過[flutterViewControllersetInitialRoute:@"route1"];通過不同的routename加載不同flutter頁面不再生效胶背,原因是在AppDelegate中運(yùn)行[self.flutterEnginerunWithEntrypoint:nil];這行代碼的時(shí)候,flutter已經(jīng)初始化好了,這時(shí)在flutter中通過window.defaultRouteName獲取到的route一直是默認(rèn)的/喘先,為了解決可以加載不同flutter頁面的問題钳吟,我通過native向flutter發(fā)送消息,flutter接受到消息后加載不同頁面的方法來解決窘拯。
這時(shí)問題又來了,flutter中調(diào)用eventChannel.receiveBroadcastStream(postArg).listen(onData ,onError: onError);時(shí)苦丁,OC代碼中的FlutterEventChannel還未運(yùn)行到搏色,這就導(dǎo)致eventSink綁定不成功,所以[flutterEngine runWithEntrypoint:nil];與FlutterEventChannel對(duì)象必須同時(shí)生成末盔,我是通過單例解決這一問題的:
項(xiàng)目啟動(dòng)初始化單例,如果等到點(diǎn)擊進(jìn)入flutter頁面的時(shí)候再初始化單例,這時(shí)[flutterEngine runWithEntrypoint:nil];運(yùn)行策幼,flutter剛剛創(chuàng)建會(huì)導(dǎo)致跳轉(zhuǎn)時(shí)頁面會(huì)白2-3秒来累,所以在項(xiàng)目初始化時(shí)锉试,將flutter也初始化拱礁。