2010-09-06 55 views
3

我查了所有在我的代码,并不能找到这崩溃之源: 我试图解码与NSKeyedUnarchiver一个对象,它在它的每一次崩溃,并说:Objc内存崩溃与autorelase

*** __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]; 

我试图保留这部分(甚至是字符串)的一切,但它并不能帮助。

+0

你可以张贴一些代码? – 2010-09-06 03:56:21

+0

嗯,但它是一个非常深的堆栈 – 2010-09-06 04:05:47

+0

它看起来像你正在重新定义模型。路径是伊娃吗?我认为步骤1将确切地找出哪个对象试图获得两次释放。有点棘手,只有很少的代码可以继续。 – taber 2010-09-06 04:39:53

回答

2

这是一个很难解决部分是因为调试内存不一致的行为。

我有2个班JGStaticModelJGModel。出于某种原因,unarchiver会随机选择其中一个,所以有时initWithCoder被发送到JGModel而不是JGStaticModel。这导致我认为它没有被调用。此外,由于它们的结构略有不同,因此存在问题并坠毁。之所以出现autorelease问题,是因为我在JGStaticModel中修补了一些内存问题,但不是JGModel,所以它会在内存上崩溃,因为我没有修复它。

感谢您的帮助!

1

尝试启用NSZombieEnabled,这会帮助你追踪问题。

+0

我已经试过了。 – 2010-09-06 04:01:22

0

如果没有工具(运行 - >与性能工具运行)和NSZombiesEnabled帮助,你可以重写 - (ID)保留和 - 导致异常的类(无效)的释放方法。调用超级实现和日志保留/释放。您可以使用此方法来查看调用堆栈。这种方式是不漂亮,但它帮助我一些时间来找出了一个额外的发布/自动释放呼叫

0

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

相关部分是:

如果设置与字符串值命名为“NSAutoreleaseHaltOnFreedObject”环境变量“YES”,该功能会自动在调试器打破