Objective c 带自动弹性的Objc内存崩溃

Objective c 带自动弹性的Objc内存崩溃,objective-c,memory,crash,Objective C,Memory,Crash,我一直在搜索我的代码,但找不到这次崩溃的根源: 我试图用NSKeyedUnachiver解码一个对象,它每次都会崩溃并说: *** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008ad200) ignored *** __NSAutoreleaseFreedObject(): release of previously deallocated object (0x1008ab200) ig

我一直在搜索我的代码,但找不到这次崩溃的根源: 我试图用NSKeyedUnachiver解码一个对象,它每次都会崩溃并说:

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

我已尝试保留此部分中的所有内容(甚至字符串),但没有帮助。

尝试启用,这将有助于跟踪问题。

如果工具(运行->使用性能工具运行)和NSZombiesEnabled都没有帮助,则可以重写导致异常的类的-(id)retain和-(void)release方法。调用超级实现和日志保留/发布。您可以打断此方法以查看调用堆栈。然而,这种方式并不漂亮,它帮助我花了很少的时间找出了额外的释放/自动释放调用的位置。这是一个很难解决的问题,部分原因是调试内存的行为不一致

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


谢谢你的帮助

用给出的解决方案,这个问题很容易解决

有关部分是:

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


嗯,当然,但这是一个相当深刻的问题。看起来你们在重新定义模型。路径是ivar吗?我认为第一步应该是弄清楚到底是哪个对象试图释放两次。代码太少有点棘手。它的工作原理有点混乱,不,我基本上不是这样。当你从一个文件加载一个模型时,它使用NSKeyedUnarchiver对其进行解码并将数据复制到自身中。相信我,当垃圾收集启动时,它甚至可以在iPhone上工作。你的
initWithCoder:
看起来像什么?这似乎就是bug出现的地方。相当不错的钱这不是可可粉的问题。在托管内存而不是垃圾收集下会发生错误的原因是垃圾收集会阻止您释放仍被引用的对象,这就是导致此类错误的原因。我在其中设置了一个断点,它在被调用之前就崩溃了!