Egret社区
QQ截图20210111163726.png
如图:可滑动列表里面带有一个可滑动列表的item;

重现方式:当点击到子item时并上下滑动,然后关闭界面时,会有几率(较大几率 10次出现 7次把)内存清除不掉。

根本原因:上一层的scroller 移动时(调用到onTouchMove),会派发CancelEvent事件,这时如果子列表当前没有移动([5 /* touchMoved */]为false)的话将会被移除监听事件 onTouchEnd。导致执行不到最后的egret.stopTick,导致内存泄漏。
目前解决方法:重写scrollor 派发事件 dispatchCancelEvent。过滤掉子类中的eui.Scroller对象
QQ图片20210111165347.png

分享到 :
1 人收藏

12 个回复

倒序浏览
app小王子  社区管理员 | 2021-1-12 11:04:20
收到 我反馈给研发 谢谢!
rain_rain_rain  初学乍练 | 2021-1-12 14:35:23
希望讨论下。
有个疑问:如果发生了以上的内存泄漏,那么理论上scroller包括使用scroller的界面类都不会释放的,就算标记清除也释放不了。
如果是这样那么基本上使用了scroller嵌套的界面都会释放不了,这是很严重的问题,而且很容易被发现。
但是发现现在使用了scroller嵌套的界面类都被正常释放了
一只小菜鸡  登堂入室 | 2021-1-12 17:39:22
rain_rain_rain 发表于 2021-1-12 14:35
希望讨论下。
有个疑问:如果发生了以上的内存泄漏,那么理论上scroller包括使用scroller的界面类都不会释 ...

需要满足条件, 滚动时子scroller 不滚动,可以将子scroller 的 scrollPolicyV 改为off(如果你的子scroller是水平滚
                          动的话)这样会很容易出现。不然只要子scrollor中的list有些许移动 scrollor都不会移除掉监听。
                           也就可以 执行touchEnd方法
rain_rain_rain  初学乍练 | 2021-1-13 11:07:10
一只小菜鸡 发表于 2021-1-12 17:39
需要满足条件, 滚动时子scroller 不滚动,可以将子scroller 的 scrollPolicyV 改为off(如果你的子scroll ...

我看了下源码,也是觉得有内存泄漏的。我尝试了你说的方法,还有一些我觉得会出现的情况。但是我关掉使用了scroller嵌套的界面后,发现scoller依然被正确释放了(在heap snapshot中看到对象已经不在了)。
一只小菜鸡  登堂入室 | 2021-1-13 17:06:03
关键代码有点小纰漏 QQ截图20210113165340.png 附上重现步骤 以及内存泄漏图
两个ui
QQ截图20210113165634.png
水平滚动 所以我将scrollPolicyV 设置为false
QQ截图20210113165612.png
测试代码 写个remove方便移除 demo5里面就是这个皮肤文件 仅此而已

QQ截图20210113170053.png
操作步骤
QQ图片20210113170323.png
内存泄漏
QQ图片20210113170431.png



rain_rain_rain  初学乍练 | 2021-1-14 14:53:04
一只小菜鸡 发表于 2021-1-13 17:06
关键代码有点小纰漏:附上重现步骤 以及内存泄漏图
两个ui

感谢指点!复现出来了,我知道为什么我前面会复现不出来了,我移出舞台的时候都会调用Scroller的stopAnimation()方法,所以才出现没有内存泄漏的。我再次新建helloWorld项目,移出舞台不调用stopAnimation()方法就出现内存泄漏了。我也看了源码确认了stopAnimation()方法会执行egret.stopTick。

那么解决这个内存泄漏问题,除了前面你说的那样更改引擎源码,如果不想改引擎源码的话。还可以对所有使用Scroller嵌套的类中,在子Scroller移出舞台时调用Scroller的stopAnimation()方法。当然这个方案是根据你发现的问题才想出来的
app小王子  社区管理员 | 2021-1-15 17:56:02
看了2位的讨论 我已经反馈给研发了 研发后面也会去确认这点的  谢谢大家的反馈
app小王子  社区管理员 | 2021-3-2 11:29:04
该问题会在5.4.1中修复 大家可以去测试一下
qwepoi123  登堂入室 | 2021-3-4 12:04:27
我用楼主给出的修复方式  在拖动的时候会有一个指向dispatchPropagationEvent函数的报错  
具体的话应该是在函数里currentTarget调用$notifyListener的时候  这个$notifyListener是个不存在的函数  此时i是0的情况
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|京网文[2014]0791-191号|京ICP证150115号|Egret社区 ( 京ICP备14025619号 )

Powered by Discuz! X3.4 © 2001-2019 Comsenz Inc.

返回顶部