NSZombieEnabled не работает

Когда я устанавливаю NSZombieEnabled = Yes, на консоль ничего не записывается. Как я могу это исправить? Или вы можете посоветовать мне другие инструменты для EXC_BAD_ACCESS?

Ответы

Ответ 1

У вас обычная старая авария. EXC_BAD_ACCESS означает, что ваше приложение попыталось получить доступ к недопустимому адресу памяти. Хотя наиболее типичной причиной этого в приложении non-GC'd objective-c является обмен сообщениями с объектом после освобождения, что обнаруживает этот режим Zombie Mode, этот конкретный сбой может произойти любым количеством других способов (как показано).

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

Как сказал Брэд, запустите приложение с включенной отладкой. В Xcode вы найдете пункт меню "Run/Debug" в меню "Run". Используйте это. Когда приложение падает, вы должны увидеть трассировку стека в верхнем левом углу окна отладчика.

Нет, действительно, они появляются в отладчике. Картинка стоит 1000 слов. alt text http://www.friday.com/bbum/wp-content/uploads/2010/02/Crash.png

Ответ 2

"EXC_BAD_ACCESS" необязательно связан с экземпляром зомби. Он может быть связан с доступом к ссылке undefined, как локальная переменная.

NSArray *array;
[array objectAtIndex:0]; // <- Will throw an error

Edit: Флаг NSZombie поможет вам решить "EXC_BAD_ACCESS", вызванную использованием выделенного экземпляра.

Чтобы решить ошибки, вы должны использовать обратную трассировку сбоя, чтобы точно определить место, которое не так. Затем вернитесь в свой код и проверьте каждое назначение и распределения.

Ответ 3

Также убедитесь, что вы инициализируете все указатели нулем перед их использованием!

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

Например, следующий код также предоставит EXC_BAD_ACCESS, который не отслеживается с использованием флага NSZombieEnabled, вызванного последней строкой.

RecordingLocation* closest;

//find the closest recording location
for (...)
{
    //try to find the closest object...
    //suppose we don't find anything so closest is never set.
}

if (closest!=nil)
    NSLog(@"Closest: %f,%f",closest.x,closest.y);

Ответ 4

Я не понимаю, как ответ на этот вопрос действительно отвечает на вопрос.

Я спрашиваю себя то же самое. используя xcode4, я включил NSZobmieEnabled = YES, чтобы остановить, когда я обращаюсь к выпущенному объекту, вместо сбоя с EXC_BAD_ACCESS - что очень полезно.

вопрос был:

"Когда я устанавливаю NSZombieEnabled = Да ничего не записывается в консоль. Как я могу исправить это...".

простой и прямой.

У меня такая же проблема. xcode останавливается с отладчиком, но консоль не создает никаких сообщений. я бы ожидал чего-то вроде:

", отправленное на освобожденный экземпляр...".

Ответ 5

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

Вы пытались запустить приложение в отладчике (Run | Debug - Breakpoints On)? Как только вы нажмете EXC_BAD_ACCESS, отладчик должен остановиться. Если вы посмотрите на обратную трассировку, отображаемую в отладчике (Run | Debugger), он может показать вам, где произошла ошибка.

Ответ 6

Поскольку я просто потратил 20 минут на то, что NSZombieEnabled не работает, я думал, что добавлю это, приведет к тому, что EXC_BAD_ACCESS

NSArray *arr = [NSArray arrayWithObjects:@"@dog","@cat",nil];

Обратите внимание на отсутствие "@" во втором параметре. Я не сделал: -)

Ответ 7

У меня был другой опыт работы с EXC_BAD_ACCESS, поэтому я хотел бы поделиться.

Как указано в вопросах, хотя NSZombieEnabled был проверен, на консоль ничего не было написано. После нескольких часов боев в симуляторе я решил установить его на устройство. Сообщение об ошибке, которое я получил от отладки с устройством, было более полезным.

В конце концов, я заметил, что я получал ошибку EXC_BAD_ACCESS и странное поведение, потому что за неделю раньше я переименовал пару xib файлов. Я выбрал объект View Controller для файла MainWindow.xib и исправил свойство NIB Name. Затем все работало гладко.

Ответ 8

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

И еще одна проблема, которую я заметил при использовании зомби: Иногда это также вызывает сбои при отладке. Один случай, который я поймал, разбился, показывая:
*** -[MagazineWebview respondsToSelector:]: message sent to deallocated instance 0x58ce2a0
Это происходит только при включении NSZombie.

Что я делаю, на сайте - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
Я освобождаю текущий объект "MagazineWebview" и загружаю данный [URL запроса] в другой объект "MagazineWebview". Для достижения моих функций...

спасибо