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");

                    // 这里为什么这么做
                    // 这里先移除,返回值为null,外面自然会再添加
                    // 更多细节请看 CSRepresentedObject 注释!
                    // 这里唯一需要纠结一下的就是 round 参数,总是传 0 吧,现在已经不需要检查 round 是否是上一轮的
                    // 而且在手机上跑的话也不可能出现遗留上一轮对象的问题,因为一共只有一轮
                    JSMgr.removeJSCSRel(jsObjID, 0 /* round TODO */);
                    JSMgr.removeJSFunCSDelegateRel(jsObjID);
                }
                return(tar);
            }
            return(ret);
        }
        return(null);
    }
    void OnDestroy()
    {
        if (!JSMgr.IsShutDown)
        {
            callIfExist(idOnDestroy);
        }

        if (jsSuccess)
        {
            // remove this jsObjID even if JSMgr.isShutDown is true
            JSMgr.removeJSCSRel(jsObjID);
        }

        if (JSMgr.IsShutDown)
        {
            return;
        }

        if (jsSuccess)
        {
            // JSMgr.RemoveRootedObject(jsObj);
            JSApi.setTraceS(jsObjID, false);
            // JSMgr.removeJSCSRel(jsObjID); // Move upwards

            // jsObjID 并没有 finalize(Js那边的析构回调)
            // 所以在这里必须手动移除
            JSApi.removeByID(jsObjID);
            removeMemberFunction();
        }
    }
Esempio n. 4
0
    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);
    }
Esempio n. 5
0
    private void OnDestroy()
    {
        if (!JSMgr.IsShutDown)
        {
            JSMgr.vCall.CallJSFunctionValue(jsObjID, idOnDestroy);
            UnRegisterJcom();
        }

        if (jsSuccess)
        {
            // remove this jsObjID even if JSMgr.isShutDown is true
            JSMgr.removeJSCSRel(jsObjID);
        }

        if (JSMgr.IsShutDown)
        {
            return;
        }

        if (jsSuccess)
        {
            // JSMgr.RemoveRootedObject(jsObj);
            JSApi.setTraceS(jsObjID, false);
            // JSMgr.removeJSCSRel(jsObjID); // Move upwards

            //
            // jsObj doesn't have finalize
            // we must remove it here
            // having a finalize is another approach
            //
            //JSApi.removeByID(jsObjID);
            //removeMemberFunction();
        }
    }