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". Для достижения моих функций...
спасибо