Objc与autorelase的内存崩溃

时间:2010-09-06 03:52:52

标签: objective-c memory crash

我一直在搜索我的代码,但无法找到此崩溃的来源: 我正在尝试使用NSKeyedUnarchiver解码一个对象,并且每次都崩溃并说:

*** __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 个答案:

答案 0 :(得分:2)

这部分难以解决,因为调试内存行为不一致。

我有2个课程JGStaticModelJGModel。出于某种原因,unarchiver将随机选择其中一个,因此有时initWithCoder被发送到JGModel而不是JGStaticModel。这让我觉得它没有被召集。此外,由于他们的结构略有不同,它有问题和崩溃。我之所以遇到自动释放问题的原因是我修补了JGStaticModel中的一些内存问题,但没有JGModel,所以它会在内存上崩溃,因为我没有在那里修复它。

感谢您的帮助!

答案 1 :(得分:1)

尝试启用NSZombieEnabled,这可以帮助您找到问题。

答案 2 :(得分:0)

如果两个工具(Run - > Run with Performance tools)和NSZombiesEnabled都没有帮助,你可以覆盖 - (id)retain和 - (void)释放导致异常的类的方法。调用超级实现并记录保留/释放。您可以使用此方法来查看调用堆栈。这种方式并不漂亮,但是,它帮助我几点时间找出额外发布/自动释放呼叫的位置

答案 3 :(得分:0)

使用here给出的解决方案很容易解决这个问题。

相关部分是:

  

如果名为“NSAutoreleaseHaltOnFreedObject”的环境变量设置为字符串值“YES”,则该函数将在调试器中自动中断