Ошибка EXC_BAD_ACCESS при доступе к допустимому, не выпущенному объекту - PullRequest
0 голосов
/ 11 августа 2011

У меня странная проблема, которая возникает при освобождении объекта. В методе dealloc объекта я освобождаю другой (суб) объект. Когда этот подобъект освобождается, я получаю ошибку EXC_BAD_ACCESS. Я почти уверен, что подобъект является действительным указателем прямо перед тем, как я вызову release для него.

Вот как я подтвердил странность - я установил точку останова внутри метода dealloc, прямо перед выпуском подобъекта, и он был выделен! Я могу отправлять ему сообщения, и он отвечает правильно. Другая странная ошибка заключается в том, что, если для NSZombieEnabled установлено значение YES, я вообще не получаю ошибку, даже обычную ошибку NSZombie, которая говорит о том, что я отправил сообщение освобожденному объекту, код выполняется правильно.

Кто-нибудь знает, как решить эту проблему?

Заранее спасибо!


* РЕДАКТИРОВАТЬ 1 *

Я обнаружил, что, если я помещаю [super dealloc] в конец dealloc, он падает, но если я помещаю его в начало, он не будет. У меня было что-то подобное раньше, только в другом случае - приложение зависало, если я [super dealloc] начинал свою сделку, а в конце - нет.

Почему это имеет значение, и когда вы должны использовать что?


* РЕДАКТИРОВАТЬ 2 *

Scratch Edit # 1! Это не работает в любом случае.

Ответы [ 2 ]

1 голос
/ 11 августа 2011

Может ли ваша подпрограмма dealloc выглядеть так:

- (void)dealloc
{
   [super dealloc];
   [otherObject release];
}

, если это так, измените порядок.Если вы вызовете [super dealloc], ваш объект исчезнет из памяти, и попытка доступа к otherObject позже приведет к тому, что вы получите доступ к нераспределенной памяти -> EXC_BAD_ACCESS.

0 голосов
/ 11 августа 2011

Не видя, как инициализируется объект, каждому будет сложно точно знать.

MyObject *someObject = [MyObject alloc] init...]; // Make sure you aren't autoreleasing here
// do some stuff with someObject

[someObject release];
...