Flutter 混合原生工程內(nèi)存泄露
最近啟動新項目祖秒,以原生為基礎(chǔ)框架邢享,flutter為業(yè)務(wù)開發(fā)組件嵌入趣竣,混合開發(fā)過程中發(fā)現(xiàn)每次打開一個Flutter頁面內(nèi)存增加蓖租,關(guān)閉時內(nèi)存并不釋放,明顯內(nèi)存泄露饭玲。
解決方案一
問題出來了侥祭,到底是官方的問題,還是我這邊代碼的問題茄厘,深度探究并結(jié)合網(wǎng)上解決方案 修改引擎代碼,修改引擎雖然解決了問題矮冬,但是每次官方發(fā)布新版本(如官方?jīng)]解決)都需要重新編譯引擎,相當麻煩次哈。
解決方案二
混合開發(fā)內(nèi)存泄露如果很普遍胎署,官方應(yīng)該會很快解決才對。
懷疑是不是自己代碼有問題窑滞,一步步刪除自己代碼琼牧,發(fā)現(xiàn)如果自己不注冊channel,單獨使用flutterViewController并不會出現(xiàn)內(nèi)存泄露,當注冊methodChannel或eventChannel時出現(xiàn)內(nèi)存泄露哀卫,原因上面方案已經(jīng)有介紹并提供了方案解決巨坊。
轉(zhuǎn)移思考:
第三方插件怎么實現(xiàn),會內(nèi)存泄露嗎此改?是不是官方并不建議混合開發(fā)通過這種方式注冊channel趾撵。
引入第三方flutter插件發(fā)現(xiàn)并不會內(nèi)存泄露,解決方案出來了共啃,去除自己注冊channel方式
[FlutterChannelManager registerWithRegistry:self];
FlutterMethodChannel *flutterChannel = [FlutterMethodChannel methodChannelWithName:FLUTTER_METHOD_CHANNEL binaryMessenger:binaryMessenger];
[flutterChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) {
}];
}
采用插件式注冊
[FlutterChannelManager registerWithRegistrar:[self registrarForPlugin:@"FlutterChannelManager"]];
FlutterMethodChannel *flutterChannel = [FlutterMethodChannel methodChannelWithName:FLUTTER_METHOD_CHANNEL binaryMessenger:[registrar messenger]];
FlutterChannelManager *instance = [[FlutterChannelManager alloc] init];
[registrar addMethodCallDelegate:instance channel:flutterChannel];
解決方案三
注冊插件時占调,傳入messageBinary為FlutterViewController的引擎,也能解決循環(huán)引用的問題
[FlutterChannelManager registeMethodChannel:self.engine];
FlutterChannelManager類實現(xiàn)registeMethodChannel:
+ (void)registeMethodChannel:(NSObject<FlutterBinaryMessenger> *) binaryMessenger {
FlutterMethodChannel *flutterChannel = [FlutterMethodChannel methodChannelWithName:FLUTTER_METHOD_CHANNEL binaryMessenger:binaryMessenger];
[flutterChannel setMethodCallHandler:^(FlutterMethodCall * _Nonnull call, FlutterResult _Nonnull result) {
}];
}
原因出在創(chuàng)建channel時移剪,造成了循環(huán)引用妈候,導(dǎo)致flutterViewController不釋放。
這里只解決了FlutterViewController不調(diào)用dealloc方法挂滓,而且當我們需要調(diào)用開啟的FlutterViewController經(jīng)常會造成垂懸指針的導(dǎo)致Crash苦银。