Вопрос

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

Это было полезно?

Решение

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

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

Как сказал Брэд, запускайте приложение с включенной отладкой.В Xcode вы найдете пункт меню «Выполнить/Отладка» в меню «Выполнить».Используйте этот.При сбое приложения вы должны увидеть трассировку стека в верхнем левом углу окна отладчика.

Нет, правда, они появляются в отладчике.Одна картинка стоит 1000 слов.alt text
(источник: пятница.com)

Другие советы

«EXC_BAD_ACCESS» не обязательно связан с экземпляром зомби.Его можно связать с доступом к неопределенной ссылке, например к локальной переменной.

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

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

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

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

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

Например, следующий код также выдаст 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);

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

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

вопрос был в теме:

«Когда я устанавливаю NSZombieEnabled = Yes, в консоль ничего не пишется.Как я могу это исправить...".

просто и прямолинейно.

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

«сообщение отправлено в освобожденный экземпляр...».

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

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

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

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

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

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

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

В конце концов я заметил, что получаю ошибку EXC_BAD_ACCESS и странное поведение, потому что я переименован пара XIB-файлы за день до этого.Я выбрал объект «Контроллер представления» для файла MainWindow.xib и исправил Имя СИБ свойство.Затем все работало гладко.

Я думаю, что не каждый 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».Для достижения моих некоторых функций...

Спасибо

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top