engine-native
engine-native copied to clipboard
建议 jsb 2.0 回调绑定中的 attachObject 改为 root
既然 root 可以应对两种情况,使用 attach 是否没有必要?使用 root 的优势时,可以避免一个非 C++ 单例类,但是绑定出的 JS 类,被作为一个单例使用,__nativeRefs
不断增长,func 无法被释放。
文档:
- https://docs.cocos.com/creator/manual/zh/advanced-topics/jsb/JSB2.0-learning.html#如何绑定-cpp-接口中的回调函数?
// 如果当前 SomeClass 是可以被 new 出来的类,我们 使用 se::Object::attachObject 把 jsFunc 和 jsTarget 关联到当前对象中
s.thisObject()->attachObject(jsFunc.toObject());
s.thisObject()->attachObject(jsTarget.toObject());
// 如果当前 SomeClass 类是一个单例类,或者永远只有一个实例的类,我们不能用 se::Object::attachObject 去关联
// 必须使用 se::Object::root,开发者无需关系 unroot,unroot 的操作会随着 lambda 的销毁触发 jsFunc 的析构,在 se::Object 的析构函数中进行 unroot操作。
// js_cocos2dx_EventDispatcher_addCustomEventListener 的绑定代码就是使用此方式,因为 EventDispatcher 始终只有一个实例,
// 如果使用 s.thisObject->attachObject(jsFunc.toObject);会导致对应的 func 和 target 永远无法被释放,引发内存泄露。
// jsFunc.toObject()->root();
// jsTarget.toObject()->root();