【发布时间】:2014-03-08 02:43:20
【问题描述】:
我在以下代码的第 89 行遇到了一个奇怪的异常:
private byte state = 0;
.
.
.
void OnGUI(){
int i;
GUI.skin = skin;
GUI.skin.box.fontSize = 25;
GUI.skin.label.fontSize = 18;
if(state==0){
GUI.skin.font = system;
GUIContent tA = new GUIContent("A");
Vector2 tz = GUI.skin.label.CalcSize(tA);
GUI.skin.label.CalcHeight(tA,tz.x);
height = (byte) tz.y;
rows = (byte) (Screen.height/height);
mark = 0;
70 view = new Log[rows];
for(i=0;i<rows;i++){
72 view[i] = new Log();
if(vis.ValidRow()){
74 mark++;
75 view[i].time = vis.time;
76 view[i].descrip = vis.descrip;
vis.Next();
}
}
state = 1;
}
GUI.skin.font = chrome;
GUI.Box(new Rect(0,0,Screen.width,50),"Server");
GUI.color = Color.green;
GUI.skin.font = system;
short y = 50;
for(i=0;i<mark;i++){
89 GUI.Label(new Rect(10,y,200,height),String.Format("{0:yyyy/MM/dd HH:mm:ss}",view[i].time));
GUI.Label(new Rect(220,y,Screen.width-260,height),view[i].descrip);
y += height;
}
}
System.NullReferenceExeption 被抛出,由于 view 为空,但我不知道为什么。除了 view 之外,所有变量都具有正确的值。在这种情况下state是1,这意味着if里面的代码被执行了,mark是3,表示行:70、72和74执行没有问题。如果由于某种原因 new 在第 70 行失败,异常将在 72 行被抛出。我说的对吗?...但是 75 和 76 行也被毫无问题地执行了。
对于这种行为,我能找到的唯一合理解释是 view 被垃圾收集了,但不明白为什么......如果是这样,如何我可以让 view 不被垃圾收集吗?
编辑:
程序中没有其他地方将 state 设置为 1 或任何其他值。 view 永远不会在程序中的任何位置设置为 null。你看到的是整个功能代码,我只删除了变量声明和初始化,没有一个涉及 state 和 view。 state 和 view 都被声明为 private。
这段代码是我在Unity中做的一个测试项目。
编辑:
这不是一个固定的问题,它只是偶尔发生一次,而且似乎涉及某种时间安排,因为直到现在我在调试器打开的情况下完全无法重复这个问题。
【问题讨论】:
-
state是1不足以证明 if 块中的代码已经运行。问题是在其他地方设置state或其他代码将view设置为 null。 -
@lc 其他地方?在哪里?外质密码?除了变量声明和通过 Awake 进行的一些初始化之外,这几乎是整个程序,没有其他地方状态变为 1,也没有 view=null,这就是我首先发布这个问题的原因。
-
我 99% 确定这与垃圾回收无关,但你能发布
Label的代码吗? -
@lc 我无法发布该代码,因为它是 Unity 的一部分,它是内部的,我无权访问它。
-
如果
view是在OnGUI方法之外定义的,那么它不会被垃圾回收。如果它是null,那么要么它从未被设置,要么它被其他东西设置为null。我怀疑它是“外质代码”。您确定没有其他代码修改任何这些变量?如果不是,那么为什么在类范围内而不是在OnGUI方法内声明它们?
标签: c# user-interface garbage-collection unity3d