代码之家  ›  专栏  ›  技术社区  ›  rein

InitWithCoder中初始化的内存在DrawView中丢失

  •  -1
  • rein  · 技术社区  · 16 年前

    我有一些在initwithcoder:中初始化的内存。我可以在initwithcoder的“返回自我”部分之前验证内存是否已初始化。

    我使用malloc分配内存,并使用自定义函数进行填充:

    // in initWithCoder:
    fontTexCoords = (GLfloat *)malloc(10 * 8 * sizeof(GLfloat));
    [fontInfo textureCoordinatesToArray:fontTexCoords];
    NSLog(@"%f", fontTexCoords[0]);  // correctly outputs 1.0
    

    但是,在我的绘图程序中,该内存的内容似乎已归零:

    // in drawView
    NSLog(@"%f", fontTexCoords[0]); // incorrectly outputs 0.0
    

    在我的应用程序的任何其他地方,我都不会触摸内存。

    问题:为什么所有数据都丢失了?initwithcoder和drawview之间的过程是什么,对我的malloc内存有什么奇怪的地方?

    编辑:

    前8个的输出使用nslog(@“initwitcoder:%@%x%f”,self,fonttexcoords,fonttexcoords[0]在initwitcoder中浮动。 到8 )

    2009-08-22 21:25:15.220 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.221 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 1.000000
    2009-08-22 21:25:15.222 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.223 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000
    2009-08-22 21:25:15.223 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000
    2009-08-22 21:25:15.224 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000
    2009-08-22 21:25:15.224 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.500000
    2009-08-22 21:25:15.224 Memory[32706:20b] initWithCoder: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 1.000000
    

    使用nslog(@“drawview:%@%x%f”、self、fonttexcoords、fonttexcoords[0]从drawview输出 到8 )

    2009-08-22 21:25:15.399 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.399 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.400 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.401 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.403 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.404 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.404 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    2009-08-22 21:25:15.405 Memory[32706:20b] drawView: <EAGLView: 0xd19060; frame = (0 0; 320 480); autoresize = W+H; layer = <CAEAGLLayer: 0xd1b300>> D53110 0.000000
    

    谢谢

    2 回复  |  直到 16 年前
        1
  •  1
  •   Jason    16 年前

    你能把你的nslog呼叫改成包括 self 在输出中?然后确认这两个地方使用的视图相同:

    NSLog(@"%@ %f", self, fontTexCoords[0]);
    
        2
  •  0
  •   rein    16 年前

    发现了问题。那是我的愚蠢。我用错误的方法释放了记忆。不知怎么的,我把免费的(fonttexcoords)放在了layoutview而不是dealloc中。

    傻,傻我:)