NSZombieEnabled не работает

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


person onur taskin    schedule 06.01.2010    source источник


Ответы (8)


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

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

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

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

person bbum    schedule 06.01.2010
comment
Это мой голос за «Самый бесполезный ответ новичку». Каждый новичок, такой как я, знает, что старые добрые ошибки EXC_BAD_ACCESS не отображаются в окне отладчика, в любом случае не таким образом, чтобы это было понятно или полезно для смертных. Если бы они это сделали, объем сообщений на CocoaDev или StackOverflow легко был бы вдвое меньше, чем сейчас. (Ладно, утрирую, три четверти). - person Elise van Looij; 03.02.2010
comment
EXC_BAD_ACCESS — это простой и понятный сбой. Отладчик улавливает указанный сбой и показывает, где именно он произошел. Почему это произошло в первую очередь, может быть не так ясно, как на этой картинке. - person bbum; 03.02.2010
comment
нравится имя файла (но это полезный скриншот +1) - person Rob Fonseca-Ensor; 03.02.2010
comment
@Rob Я создаю в среднем от 2 до 5 одноразовых проектов в день в /tmp/, отсюда и название. :) - person bbum; 03.02.2010
comment
Отличный ответ. Кроме того, к концу дня у меня есть по крайней мере три одноразовых проекта, названных DeleteMe1-3, чтобы напомнить мне, что я должен очистить их позже... - person rcw3; 03.02.2010
comment
Вот почему я делаю их в /tmp/ — в конечном итоге они удаляются автоматически. - person bbum; 03.02.2010
comment
@bbum так последователен ли fdfkdjkdfjjdfk? - person Rob Fonseca-Ensor; 04.02.2010

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

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

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

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

person Laurent Etiemble    schedule 06.01.2010

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

Если вы используете указатель, не инициализируя его значением 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);
person xastor    schedule 22.03.2010

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

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

назревал вопрос:

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

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

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

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

person Nir Pengas    schedule 16.05.2011

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

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

person Brad Larson    schedule 06.01.2010

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

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

Обратите внимание на отсутствующий «@» во втором параметре. Я не :-)

person Dan Bennett    schedule 30.09.2010

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

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

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

person Topsakal    schedule 01.08.2012

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

Благодарность

person Naveen Shan    schedule 25.01.2011