
如图中所示,因为要使用参数,我在一个监听器的回调中这样使用箭头函数,我们老大说会造成内存泄漏,因为箭头函数里调用的函数结束后不会释放,我听得有点懵,有大佬能给个详细一点的解释吗
对2dx不熟 顺便问下你是2dx还是creator啊? 没看源码 猜测一下 如果icon被销毁时 会自动off掉身上所有的事件。那这样写无所谓 最多就是你没办法自己off掉罢了。因为你没有持有这个匿名函数 所以你没办法自己off。(如果不会自动off 那就泄漏了)
箭头函数里调用的函数结束后不会释放。。?我也听得有点懵。要不你问下你老大 最多被老大毒打一顿。
感谢解答,已经知道了怎么回事,因为有一个onDisable,那个是场景退出的时候会执行的,必须在那里释放监听,因为有可能程序执行到一半就被退出了,没有执行到释放监听的地方。
节点事件会随着节点销毁而销毁,不需要主动销毁。
有没有人来个比较官方准确的答案呀。
你可以试试这样监听之后能不能取消监听,如果off(cc.Node.EvenType,TOUCH_START,()=>{…})不能正常取消监听那就有可能造成泄露。我们的项目中对这种监听方式是尽量避免的。
这里的回调会产生一个闭包.
但在node被remove的时候是会清掉事件绑定的,回调函数清掉了,回调函数的闭包也就没有了.
我认为是不会有内存泄漏的.
我也感觉不会,但是为了规范,建议别这样写吧 
点击同一个按钮应该都是调用同一个函数, 点击的时候不会生成新函数
只要这个按钮在创建的时候只添加一次on的监听就不会有问题 销毁的时候会自动把他监听的函数都去掉 假如你这个按钮不会销毁 又刷新的时候给他添加on的话 之前的是不会被销毁的 就会有内存泄漏
这种后面的this也不用加
问题就在这,调用的是箭头函数,箭头函数里调用了一个新的函数,且这个函数因为要带有参数,所以需要消耗额外的内存。
好的,感谢分享,不过我遇到的不是这个情形。
我一直都是这么用的…也没见什么泄漏
问了一下同事,结合各位大佬的解答,应该就是因为我这种写法没办法手动移除监听,所以会造成内存泄漏,但是其实等节点移除了,事件是会一起被移除的,所以主要问题是我没有及时的去销毁节点。
你这种写法,确实不太方便移除监听,只能通过listener.targetOff(this),移除跟这个this对象关联的所有监听,肯定不推荐这么写(说的委婉了,就不应该这么写,如果就执行一次,那没啥)
如果你尝试自己去写一个事件监听管理器,你就理解了,你这个循环里,做的是同一件事,但是每次遍历都往监听器里新增了一组对象,为啥?,因为箭头函数相当于每次重新生成了新的function对象,更好的写法应该是你在当前类写一个方法,用this.xx 传给它,都ok呀
感谢分享,我经验还不足,很多东西都还不知道,写法上也确实还有很多问题,我试试你说的这方法。谢谢大佬。
彻底懂了,注册的监听事件不一定会随着节点的销毁而销毁,所以正常都是注册了之后要手动off掉它,但是箭头函数是没办法off的,只能通过@firewoof说的那样使用targetOff注销所有监听才能移除。
所以我之前都是这样用的this.node.on(“click”,()=>{}),这应该咋办。