玄学!奇怪的原生import问题

版本2.4.8
问题应该出在config.json
config.json.zip (9.8 KB)
@1226085293 你处理过这一块没

发生在合并A、B两个项目

-------------表现症状--------------

声明一个ts类


导出单例(可以是任何单例导出方法)
image

在其他类中使用,使用的位置 一

使用的位置 二

为了对比 一 和 二 GlobalData的是否是同一个对象,在 一 打开 二 页面的时候传入 一 的GlobalData,和 二 做对比

在web中调试的时候,两个globalData是同一个对象
image

而在原生iOS中,却不相同

这意味着,两个GlobalData在导入后,他们不相同!不是同一个class

单独运行合并前的B项目,使用Globaldata相等与否的判定方法,在ios就是相同的
image

合并后就会变为不相同

-------------GlobalData是否相同的验证方法------------

~~~~~~~~~~~~
1页面,import语句
import GlobalData from “./JC/Common/GlobalData”;

1页面调起2页面,调起方法很简单

Tool.loadResPrefab('TD/UI/dock', function (prefab) {
            let p = cc.instantiate(prefab);
            p.getComponent('Dock').test(GlobalData);
            self.node.addChild(cc.instantiate(prefab))
        })

~~~~~~~~~~~~
2页面 ,import语句
import GlobalData from “…/JC/Common/GlobalData”;

 test(p){
        console.log('相同--》',p == GlobalData)
    },

这不是玄学的单例问题,这是因为你写了一个不是单例的单例。image 是类,image 是对象,image 这里又可变,你告诉我,这真的是单例吗?

我没看明白您想表达什么,那就改改标题,怎么写能在原生中 import同一个对象

意思很简单,你代码写错了,你第一次打印的时候,role还没有赋值,第二次打印的时候,role已经有值了,那么这2个role肯定不是同一个对象啊。

感谢您认真的分析,但您的分析不对,new class ->A并export default之后,其他位置进行import,class将始终是A,无论class内的属性怎么变动,class本身是不会变更的。
您对new class的理解还需加深。
这估计是引擎的问题,这个问题没那么简单。
我把新旧两个项目合并到了一起,起初并没有这个问题,运行正常,后来将新旧两个项目的公用库(相同)删除一个,让新项目使用旧项目的公用库(也就是你看到的global…这一堆东西),就出现了这个问题,就好像新旧两个项目虽然在一起,但导入的却不是同一个对象,web正常,原生就不同,太奇怪了。
建议回答的大佬们仔细审题,不讨论基本的入门型代码问题,别偏了方向。
已尝试过删除缓存、删除APP、删除build等等操作。

image 能否看一下,你这里是怎么打印的

export new class 是我在出现问题后尝试的办法,最开始的写法是


其他地方使用时,是import后

直接GlobalData.xxx 这样来使用,因为xxx是static静态,但神奇的是,新合并的prefab在同样import后,GlobalData就会在原生发生变更。

所以我干脆导出 new class,确保导出的是同一个class,而问题依旧。

甚至我用了这种写法

在新打开的prefab使用cc.GlobalData,问题仍然如此。

只有重新合并了,我才疏学浅,解决不了这个ios和web表现不一致的问题。希望有遇到过此情况并能解决的,分享修改的办法。

也希望引擎团队能找到些端倪,已经属于玄学范畴,确定代码无错,web上一切正常,build一次原生时间太长了,我就不试了

export default class GlobalData {
    private static _instance: GlobalData = null;
    public static getInstance() {
        if (!this._instance) {
            this._instance = new GlobalData();
        }
        return this._instance;
    }
}

用到的地方 改成 GlobalData.getInstance()

let gd = GlobalData.getInstance();
//todo gd.xxx
或者 直接 GlobalData.getInstance().xxx

如果想看看 是不是创建了多个对象,可以加个constructor

constructor() {
     //打印一下,看看是不是创建了多个对象   
    }

这不标准单例写法么,已经开始重新合并了,不捣鼓了。
这样写也解决不了问题,问题出在import后 GlobalData会不同,且只发生在原生IOS。
就是说在位置A写GlobalData.getInstance() 和位置B 写GlobalData.getInstance()
GlobalData不是同一个,所以getInstance也不是同一个。
玄学。

就像我发的第一个图片
A页面赋值GlobalData.player = xxx
在B页面再调用GlobalData.player,将会返回默认的null,而不是xxx

你有试过么?

试过了,我这一天全在解决这个问题,而且各种写法都在做尝试。而且在新旧项目(新版本)合并之初,项目成功运行,在ios也是没问题的,后来修改共用的库文件出现了这个问题,也无非是改了改import的路径,并没有其他操作,上面也说过了,这是一个线索,留给需要的人去分析吧,我不需要了,血压都上来了

有没有可能是包的问题,就是2个包共同引用了一个类,以前搞flash的时候好像有这种问题,但是具体情况。比如第一次发一个包,这个包包含里类A(这里叫A1),但是发第二个包的时候,类A发生了修改(这里叫A2),部分情况下,A2会不生效,部分情况下A1和A2都会生效。才疏学浅,具体情况记不清了

你看下你导出的单例是global实例 ;而import的是GlobalData 类 你看看是不是这个原因咯

偷偷的问一下,你这个字体是什么字体,看着好看诶

image

请教一下引擎组,项目合并的正确操作
A项目-》在线项目,在原生无任何问题
B项目-〉新版本内容,在原生无任何问题
A和B有一些相同的文件,即服务器交互模块
当我合并时,将B项目的内容复制到A项目,包括 script、resources、scene,会将meta文件同时复制。
复制完成后,将相同的代码模块留其中一份,已经尝试过删除A项目或B项目的相同文件,然后将另一项目的import路径做修改。
B项目完全独立于A,是新的游戏内容,A只需一个按钮跳转到新项目的prefab。
删除A项目下的build、temp、等文件夹,让编辑器重新导入资源。之后重新构建ios。
当我这样做之后,即使在A项目中单独运行B,因为B的scene也在,B的内容也会出错,也就是上面发的那样类似的内容。
请问正确的合并方式是啥,我感觉就像有什么设置控制着import
web正常,就ios不行
@panda @jare

不是代码的问题,A项目和B项目单独在ios运行都什么毛病没有。合并到A后,单独运行合并后的B,也会出现错误。肯定是什么地方控制着import的逻辑,或者项目的什么位置写了缓存

就算我把新版本内容的B项目的东西什么都不动,放到A项目,只改动对应的import路径,然后运行B项目之前的内容,也会出现这种import不相同的问题,是什么地方控制着ios的import逻辑吗?
确定合并后在web已经没有任何问题。

看您注册日期是老手了,补充了一下情况,您给看看有没什么线索