我一直在搜索我的代码,但无法找到此崩溃的来源: 我正在尝试使用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];
我已尝试保留此部分中的所有内容(即使是字符串),但它没有帮助。
答案 0 :(得分:2)
这部分难以解决,因为调试内存行为不一致。
我有2个课程JGStaticModel
和JGModel
。出于某种原因,unarchiver将随机选择其中一个,因此有时initWithCoder
被发送到JGModel
而不是JGStaticModel
。这让我觉得它没有被召集。此外,由于他们的结构略有不同,它有问题和崩溃。我之所以遇到自动释放问题的原因是我修补了JGStaticModel
中的一些内存问题,但没有JGModel
,所以它会在内存上崩溃,因为我没有在那里修复它。
感谢您的帮助!
答案 1 :(得分:1)
尝试启用NSZombieEnabled,这可以帮助您找到问题。
答案 2 :(得分:0)
如果两个工具(Run - > Run with Performance tools)和NSZombiesEnabled都没有帮助,你可以覆盖 - (id)retain和 - (void)释放导致异常的类的方法。调用超级实现并记录保留/释放。您可以使用此方法来查看调用堆栈。这种方式并不漂亮,但是,它帮助我几点时间找出额外发布/自动释放呼叫的位置
答案 3 :(得分:0)