NSZombieEnabled не работает - PullRequest
       14

NSZombieEnabled не работает

15 голосов
/ 06 января 2010

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

Ответы [ 8 ]

30 голосов
/ 06 января 2010

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

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

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

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

10 голосов
/ 06 января 2010

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

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

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

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

6 голосов
/ 17 мая 2011

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

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

вопрос был под рукой:

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

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

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

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

6 голосов
/ 22 марта 2010

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

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

Например, следующий код также даст 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 голосов
/ 06 января 2010

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

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

1 голос
/ 01 августа 2012

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

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

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

1 голос
/ 01 октября 2010

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

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

Обратите внимание на пропущенный '@' во втором параметре. Я не: -)

0 голосов
/ 25 января 2011

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

спасибо

...