EXC_BAD_ACCESS в main.m - PullRequest
       1

EXC_BAD_ACCESS в main.m

3 голосов
/ 15 июня 2011

Внезапно я получил EXC_BAD_ACCESS в этой строке:

int retVal = UIApplicationMain(argc, argv, nil, nil);

Вот код:

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

Я даже не знаю, с чего начать искать?

Может кто-нибудь помочь, пожалуйста?

Ответы [ 3 ]

10 голосов
/ 15 июня 2011

Для любых ошибок EXC_BAD_ACCESS вы обычно пытаетесь отправить сообщение освобожденному объекту. ЛУЧШИЙ способ отследить это - использовать NSZombieEnabled .

Это работает, фактически никогда не освобождая объект, а заключая его в «зомби» и устанавливаяфлаг внутри, который говорит, что обычно он был бы выпущен.Таким образом, если вы попытаетесь получить к нему доступ снова, он все еще будет знать, что было до того, как вы допустили ошибку, и с этим небольшим количеством информации вы обычно можете вернуться назад, чтобы увидеть, в чем проблема.

Это особеннопомогает в фоновых потоках, когда отладчик иногда теряет какую-либо полезную информацию.

ОЧЕНЬ ВАЖНО ЗАМЕЧАТЬ однако вам необходимо на 100% убедиться, что это только в вашем коде отладки ине ваш код распространения.Поскольку ничего не выпускается, ваше приложение будет течь и течь и течь.Чтобы напомнить мне сделать это, я поместил этот журнал в моем appdelegate:

if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
  NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
4 голосов
/ 15 июня 2011

EXC_BAD_ACCESS - это сигнал, указывающий, что вы пытаетесь получить доступ к переменной в памяти, которая была освобождена или не существует.Поскольку он появляется после освобождения пула авто-выпуска, это означает, что вы, вероятно, перевыпустили переменную с ожидающим авто-релизом, поэтому переменная больше не существует для освобождения, когда пул авто-выпуска очищается.

Существует множествосуществующие вопросы, связанные с этим, главным из которых является этот .

1 голос
/ 15 июня 2011

EXC_BAD_ACCESS часто указывает на то, что вы перепустили память.Вы можете использовать команду «Построить и проанализировать» в XCode, чтобы помочь отследить это.Я бы также предложил поместить в ваш код точки останова и операторы логирования, чтобы изолировать ошибку.

...