代码之家  ›  专栏  ›  技术社区  ›  Justin Meiners

带autorelase的Objc内存崩溃

  •  3
  • Justin Meiners  · 技术社区  · 14 年前

    我一直在搜索我的所有代码,但找不到这次崩溃的根源:

    *** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008ad200) ignored
    *** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008ab200) ignored
    *** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008a8c00) ignored
    

    不好的是,initWithCoder没有被调用的原因是它与[super initWithCoder:]有问题;这仍然让我发疯。我看了一下,指针和NSData对象是哪里出了问题:

        vertices = malloc(size_point3D * vertexCount);
        textureCoords = malloc(size_point2D * textureCount);
        normals = malloc(size_point3D * normalCount);
        faces = malloc(sizeof(GLuint) * faceCount);
    
    
        NSData *vertexData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"vertices"]];
        NSData *textureData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"textureCoords"]];
        NSData *normalData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"normals"]];
        NSData *faceData = [[NSData alloc] initWithData:[coder decodeObjectForKey:@"faces"]];
    
    
        memcpy(vertices, [vertexData bytes],  sizeof(point3D) * vertexCount);
        memcpy(textureCoords, [textureData bytes], sizeof(point2D) * textureCount);
        memcpy(normals, [normalData bytes], sizeof(point3D) * normalCount);
        memcpy(faces, [faceData bytes], sizeof(GLuint) * faceCount);
    
        [vertexData release];
        [textureData release];
        [normalData release];
        [faceData release];
    

    我试过保留这部分的所有内容(甚至是字符串),但没有任何帮助。

    4 回复  |  直到 14 年前
        1
  •  2
  •   Justin Meiners    7 年前

    JGStaticModel JGModel . 出于某种原因,无存档者有时会随机挑选其中一个 initWithCoder 已发送到 JG型号 而不是 . 这让我觉得没有人叫它。另外,由于他们的结构略有不同,它有问题和崩溃。我遇到自动释放问题的原因是我修补了一些内存问题 JG静态模型 JG型号 所以它会在内存中崩溃,因为我没有在那里修复它。

        2
  •  1
  •   AndersK    14 年前

    NSZombieEnabled ,这将帮助您追踪问题。

        3
  •  0
  •   Gobra    14 年前

    如果tools(Run->Run with Performance tools)和NSZombiesEnabled都没有帮助,则可以重写导致异常的类的-(id)retain和-(void)release方法。调用super实现并记录retain/release。您可以打断此方法以查看调用堆栈。这种方式并不漂亮,但是,它帮助了我很少的时间来找出在哪里有一个额外的释放/自动释放调用

        4
  •  0
  •   Community skywinder    7 年前

    here .

    相关部分是: