public static object getCSObj(int jsObjID) { JS_CS_Rel obj; if (mDictionary1.TryGetValue(jsObjID, out obj)) { object ret = obj.csObj; if (ret is WeakReference) { object tar = ((WeakReference)ret).Target; if (tar == null) { // JSEngine.inst.UpdateThreadSafeActions(); // if (mDictionary1.ContainsKey(jsObjID)) // Debug.LogError("ERROR: JSMgr.getCSObj WeakReference.Target == null"); // 这里为什么这么做 // 这里先移除,返回值为null,外面自然会再添加 // 更多细节请看 CSRepresentedObject 注释! // 这里唯一需要纠结一下的就是 round 参数,总是传 0 吧,现在已经不需要检查 round 是否是上一轮的 // 而且在手机上跑的话也不可能出现遗留上一轮对象的问题,因为一共只有一轮 JSMgr.removeJSCSRel(jsObjID, 0 /* round TODO */); JSMgr.removeJSFunCSDelegateRel(jsObjID); } return(tar); } return(ret); } return(null); }
Action CreateDestructAction(bool bFunction, int jsObjID, int round) { return(() => { if (bFunction) { s_funCount--; } else { s_objCount--; } // ! // 由于 refCount 可能 > 1,这里必须判断 refCount <= 0 才能 JSMgr.removeJSCSRel int refCount = JSApi.decRefCount(jsObjID); if (refCount <= 0) { JSMgr.removeJSCSRel(jsObjID, round); if (bFunction) { JSMgr.removeJSFunCSDelegateRel(jsObjID); } } // else // { // Debug.LogError(";;;//IIL.x&"); // } }); }
public static object getCSObj(int jsObjID) { JS_CS_Rel obj; if (mDictionary1.TryGetValue(jsObjID, out obj)) { object ret = obj.csObj; if (ret is WeakReference) { object tar = ((WeakReference)ret).Target; if (tar == null) { // JSEngine.inst.UpdateThreadSafeActions(); // if (mDictionary1.ContainsKey(jsObjID)) // Debug.LogError("ERROR: JSMgr.getCSObj WeakReference.Target == null"); // why do this // remove here and return null, so outside caller creates a new one // see comments in CSRepresentedObject for more detail // // parameter round here is harmless JSMgr.removeJSCSRel(jsObjID, 0 /* round TODO */); JSMgr.removeJSFunCSDelegateRel(jsObjID); } return(tar); } return(ret); } return(null); }