NSZombieEnabled полностью скрывает ошибку EXC_BAD_ACCESS - PullRequest
3 голосов
/ 21 апреля 2010

Итак, у меня есть подкласс UIView, который начинает вызывать ошибки EXC_BAD_ACCESS, когда я прохожу определенный набор условий (запуск на iPad вместо iPhone или симулятора, только первый вход в систему).Он выдает исключение, когда подкласс UIView автоматически высвобождается из пула (т.е. пул освобождается, а не когда я вызываю [view autorelease], во время последней строки, где у меня есть [super dealloc]. Я слышал об использовании NSZombieEnabled,так что я бросил это, чтобы узнать, смогу ли я получить больше информации об этом, но теперь она полностью скрывает ошибку!

Кто-нибудь знает немного больше об этом типе ситуации? Я думал, что NSZombie начнет извергать вещив мою консоль, как и раньше, но я надеюсь, что отсутствие ошибок сообщит мне также некоторую информацию.

- (void)dealloc  
{  
    [loadingLabel release];  
    [indicatorView release];  
    [super dealloc];  
} 

Редактировать: Хорошо, так что я решил проблему, лежащую в основе:

Одним из моих свойств было:
@property (nonatomic,retain) NSString * title;

Однако код этого свойства выглядит следующим образом (loadingLabel - это UILabel):

- (void)setTitle:(NSString *)title
{
    loadingLabel.text = title;
    [loadingLabel sizeToFit];
    [self setNeedsLayout];
}

- (NSString *)title
{
    return loadingLabel.text;
}

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

Однако я до сих пор не знаю, как и почему эта ошибка возникла в первую очередь и почему она появляется только на платформе iPad (а не на iphone или даже на симуляторе ipad).

Ответы [ 4 ]

1 голос
/ 23 апреля 2010

Итак, у меня есть подкласс UIView, который начинает вызывать ошибки EXC_BAD_ACCESS при выполнении определенного набора условий (запуск на iPad вместо iPhone или симулятора, только первый вход в систему). Он выдает исключение, когда подкласс UIView автоматически высвобождается из пула (т.е. пул освобождается, а не когда я вызываю [view autorelease], во время последней строки, где у меня есть [super dealloc]. Я слышал об использовании NSZombieEnabled, так что я бросил это, чтобы узнать, смогу ли я получить больше информации об этом, но теперь она полностью скрывает ошибку!

Вы получаете EXC_BAD_ACCESS, потому что пытались работать с мертвым объектом.

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

Если быть более точным, сообщение NSZombie сообщит вам, к какому классу объектов вы отправили сообщение, и какое сообщение вы отправили. Если вы установите точку останова и запустите свое приложение с активным отладчиком, отладчик прервет («прервет») ваше приложение в этот момент, так что вы сможете осмотреться и посмотреть, что отправило объекту-зомби сообщение .

На самом деле я ничего не сохраняю, а только [присваиваю] UILabel.text, который является свойством копирования.

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

Однако лучше и проще использовать шаблон Zombies от Instruments. Вместо сообщения, появляющегося в консоли отладчика Xcode, появится флаг в шкале времени инструментов с информацией. Этот флаг будет иметь кнопку «Перейти в iTunes-Store» (➲), которую вы можете нажать для получения дополнительной информации о проблеме.

0 голосов
/ 22 апреля 2010

Помните, что iPad SDK все еще находится на стадии бета-тестирования, возможно, вам следует сообщить об этом, но в Apple, если вы можете подтвердить, что это ошибка. К сожалению, их багтрекер ужасен из моего опыта.

Поведение NSZombie состоит в том, чтобы никогда не уменьшать удержание объектов, если вызывается release. Однако он отслеживает количество потенциальных ячеек и регистрирует доступ к объекту после того, как он был бы удален на консоли. Он помещает адрес объекта вместе с сообщением об ошибке, а вместе с инструментами вы можете легко найти объект по этому адресу и определить, где он был размещен и кто его сохранил / выпустил.

0 голосов
/ 22 апреля 2010

NSZombie должен выводить данные на консоль в том же месте, в котором произошел бы сбой.

Вы пробовали также запускать инструменты с помощью инструмента ObjectAlloc и включать в себя как сохранение количества, так и обнаружение зомби (вам нужнокак в исполняемом файле, так и в настройке инструмента ObjectAlloc, нажмите «i» рядом с ObjectAlloc).Когда сообщение отправляется зомби, этот инструмент помечает вас специальным всплывающим сообщением о том, что зомби был обнаружен.

0 голосов
/ 21 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...