https://docs.cocos.com/creator/3.8/manual/zh/advanced-topics/jsb-optimizations.html
destroy 函数你可以任意时间调用,但是 node 对应的 JS 对象的内存是由 GC 控制的,其关联的 C++ 对象也是在 GC 的回调中被删除的。
这里需要考虑得比较多。因为假设提供了强制把 c++ 对象释放的接口(比如叫: releaseCppObject),会导致几个问题:
- 行为上跟 web 的实现不一致,web 上 releaseCppObject 就是空实现
- 原生上调用此接口后,c++ 对象被 delete 了,但是 JS 对象还是活着的
- 如果 node 调用 releaseCppObject 后,用户代码还持有 node,并且继续使用 node 的方法和属性,那么必然导致 c++ 的崩溃或者异常,或者出现” web 上没问题,原生上怎么又出问题的“的抱怨。
Cocos2d-x 年代的 JS 和 Lua binding,使用的是 c++ 对象控制 js/lua 对象的生命周期,的确 c++ 对象能够被很及时的释放,但是 Cocos2d-JS 有 web 的参照,经常会有开发者反馈,web 上跑得好好的,原生上莫名其妙的出现 Invalid Native Object 的报错。 Cocos2d-Lua 没有参照,而且 lua 的开发者一般会有一些 cpp 的开发经验,所以 lua 的开发者比较少有此抱怨。
大部分开发者可不会关心底层到底是怎么实现的,要避开什么坑(主要是跨帧要保存一个 jsb 对象,需要 retain,不需要的时候 release,什么鬼,我一个写 js 的web开发者,你叫我 retain release 控制引用计数是什么玩意),”我web下开发得好好的,你们竟可能原生行为一致就好,别让我原生上采这种还要管理原生对象生命周期(retain、release)的坑就行“,
1赞
