Flutter 与iOS混合开发——FlutterViewController 内存释放

flutter 与 iOS混合开发中flutter很消耗内存,首先要确保创建的flutterController能及时的被销毁。
我是在老项目中通过集成flutter源码方式混合开发的,在这里就不说如何集成了,网上教程一大把。

下面说说我在项目中遇到的问题:在开发的时候首先是要创建FlutterViewController,我们进入到这个页面就是flutter渲染的界面了。在实际项目中根据需求我封装了一层FlutterViewController,新建一个继承自FlutterViewController的根控制器,这样做的好处是,可以把有些需要交互和通信的方法都封装到一个根控制器里,方便管理和使用,还可以自定义一些UI界面,比如自定义导航栏的一些属性等等。
当然也能通过dealloc监控控制器是否释放,在这里我把需要和flutter直接通信的FlutterEventChannel类也封在了初始化方法里,还有FlutterMethodChannel需要建立通信的对象。
一切建好之后,我就开始使用继承自FlutterViewController的基类创建flutter界面,一切都顺利的进行,各项通信、回调功能都运行正常,最后我习惯性的看了一下dealloc函数,竟然没有释放flutter控制器,又看了一下Memory内存,只要是创建一次flutter控制器内存就成倍的涨,退出控制器也不降,当然不会降,没有释放嘛!

这种情况我也是身经百战了,首先看一下block,只要是有block的地方我都给他weak,然后再跑起来,然并卵!然后又逐一注释代码排查,最终排查到它身上:
image.png
//这句相当于设置代理的意思
[self.eventChannel setStreamHandler:self];

只要注销此句内存便可顺利释放。我琢磨了一下,别人的代理都是weak属性,这里却是一个函数,难怪会导致循环引用,我也看不到它内在具体实现,愚人拙见,若有哪位大佬知道的还请不吝赐教!
既然找到了病症点,那就动手改吧,可是这个该从何下手!设置代理为weak?不行!遍寻各大论坛贴吧,无果!又仔细看了看该方法注释,发现一个关键话,如下图:

意思大概是通过传nil来取消程序原来的注册
image.png

看到这我忽然灵机一动,在viewWillDisappear 里注销不就OK了,控制器将要消失的时候注销,dealloc就能顺利执行了:
[self.eventChannel setStreamHandler:nil];

终于控制器得以释放,当然block里该weak的也是要weak的!

这里只是导致内存泄露诸多原因的其中一个,在这我先记下来,获取能恰好帮助到正有此问题的朋友。

你可能感兴趣的:(Flutter 与iOS混合开发——FlutterViewController 内存释放)