这是垃圾收集的异常吗?

时间:2014-03-08 02:43:20

标签: c# user-interface garbage-collection unity3d

我在以下代码的第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 ,但我无法弄清楚原因。除 视图 外,所有变量都具有正确的值。在这种情况下, 1 ,这意味着 if 中的代码已执行, 标记 3 ,表示行: 70 72 74 被执行没有问题。如果出于某种原因,会在 70 行失败,则会在行 72 处抛出异常。我是对的吗?...但行 75 76 也没有问题。

我能找到这种行为的唯一合理解释是 view 被垃圾收集,但无法理解为什么......如果是这种情况,如何我可以阻止 查看 进行垃圾回收吗?

修改

程序中没有其他地方 设置为 1 ,也没有任何其他值。 view 永远不会在程序中的任何位置设置为 null 。你看到的是整个功能代码,我只删除了变量声明和初始化,其中没有一个涉及 state ,也没有 view < / strong>即可。 视图 均声明为私有

此代码是我在 Unity 中执行的测试项目。

修改

这不是一个固定的问题,它只会偶尔发生一次,似乎涉及某种时间,因为直到现在我完全无法用调试器重复这个问题。

2 个答案:

答案 0 :(得分:0)

从我所看到的,标记是计数多少数组插槽有值,而它们被分配的索引是I.所以,这是一种可能发生的情况:

null,null,null,1,null,0,2

其中mark为3,行为7.您的第二个用于标记,访问前三个null元素。

我知道您正在将数组中的每个条目设置为新的Log(),但这是一个非常有效的逻辑错误。也许,null的对象可能不是视图或视图[I],而是查看[I] .time?执行代码的逐行跟踪,我们肯定会知道。

答案 1 :(得分:0)

我仍然不知道为什么会出现这个问题,而且可能永远都不会。我修改了 OnGUI ,所以如果 view == null 而不是 控制state == 0 ,这样一来,如果由于某些奇怪的原因 view 变为 null ,它就会被恢复。