Когда я устанавливаю NSZombieEnabled = Yes
, в консоль ничего не записывается. Как я могу это исправить? Или вы можете посоветовать мне какие-либо другие инструменты для EXC_BAD_ACCESS
?
NSZombieEnabled не работает
Ответы (8)
У вас есть обычная старая авария. EXC_BAD_ACCESS означает, что ваше приложение пыталось получить доступ к недопустимому адресу памяти. Хотя наиболее типичной причиной этого в приложении Objective-C без сборщика мусора является отправка сообщения объекту после освобождения, что обнаруживает режим зомби, этот конкретный сбой может произойти любым другим образом (как показано).
Поскольку ваше приложение дает сбой, у вас должна быть обратная трассировка. Вам нужно опубликовать этот след здесь, чтобы любой из нас мог помочь вам в дальнейшем.
Как сказал Брэд, запускайте приложение с включенной отладкой. В Xcode вы найдете пункт меню «Выполнить/Отладка» в меню «Выполнить». Используйте тот. Когда ваше приложение дает сбой, вы должны увидеть трассировку стека в верхнем левом углу окна отладчика.
Нет, действительно, они отображаются в отладчике. Картинка стоит 1000 слов.
(источник: friday.com)
«EXC_BAD_ACCESS» не обязательно связан с экземпляром зомби. Это может быть связано с доступом к неопределенной ссылке, такой как локальная переменная.
NSArray *array;
[array objectAtIndex:0]; // <- Will throw an error
Редактировать: флаг NSZombie поможет вам решить только «EXC_BAD_ACCESS», вызванный использованием дераспределенного экземпляра.
Чтобы устранить ошибки, вы должны использовать обратную трассировку сбоя, чтобы точно определить неправильное местоположение. Затем вернитесь назад в свой код и проверьте каждое назначение и распределение.
Также убедитесь, что вы инициализируете все указатели нулями перед их использованием!
Если вы используете указатель, не инициализируя его значением nil или любым другим объектом, вы, вероятно, в конечном итоге получите доступ к памяти, которая не принадлежит вам.
Например, следующий код также даст 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 останавливается с отладчиком, но консоль не выводит никаких сообщений. я бы ожидал чего-то вроде:
"сообщение отправлено освобожденному экземпляру...".
Если вы поищите в Stack Overflow 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 и исправил свойство Имя NIB. Затем все работало гладко.
Я думаю, что не каждый EXC_BAD_ACCESS обнаруживается при включении NSZombie..
Потому что в некоторых случаях я также не получаю результат при использовании зомби..
Я думаю, что только 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". Для достижения моих некоторых функций...
Благодарность