Objc сбой памяти с автопереключением - PullRequest
3 голосов
/ 06 сентября 2010

Я искал весь код и не могу найти источник этого сбоя: Я пытаюсь декодировать объект с помощью 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 ]

2 голосов
/ 06 сентября 2010

Это было трудно решить частично, потому что отладка памяти ведет себя непоследовательно.

У меня есть 2 класса JGStaticModel и JGModel.По какой-то причине разархиватор выбрал один из них случайным образом, поэтому иногда initWithCoder отправлялось на JGModel, а не JGStaticModel.Это заставило меня думать, что это не было вызвано.Кроме того, поскольку их структура немного отличается, у него возникли проблемы и произошел сбой.Причина, по которой у меня возникла проблема с автоматическим выпуском, заключалась в том, что я исправил некоторые проблемы с памятью в JGStaticModel, но не в JGModel, так что это могло привести к сбою памяти, потому что я там не исправил.

Спасибо за помощь!

1 голос
/ 06 сентября 2010

Попробуйте включить NSZombieEnabled , это должно помочь вам отследить проблему.

0 голосов
/ 29 марта 2012

Эту проблему очень легко решить с помощью решения, данного здесь .

Соответствующая часть:

Если переменная окружения с именем «NSAutoreleaseHaltOnFreedObject» установлена ​​со строковым значением «YES», функция автоматически прекратит работу в отладчике

0 голосов
/ 06 сентября 2010

Если не помогают ни один из инструментов (Выполнить -> Выполнить с инструментами производительности) и NSZombiesEnabled, вы можете переопределить - (id) сохранить и - (void) методы освобождения класса, вызвавшего исключение.Вызовите супер реализацию и сохраните / отпустите журнал.Вы можете сломать эти методы, чтобы увидеть стек вызовов.Этот способ не очень красив, однако, он помог мне немного разузнать, где был дополнительный релиз / звонок по авто-релизу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...