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&");
//                }
        });
    }
Esempio n. 3
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);
    }