2010-04-21 7 views
3

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

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

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

Edit:. Итак, я Сорта решить основную проблему:

Один из моих свойств был:
@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).

+0

Просто плюс 1, потому что я получаю точно такую ​​же проблему. Кажется, он не выводит при использовании имитатора iPad. Массивная проблема, поскольку я еще не решил свою ошибку:/ – qui

ответ

0

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

+0

Упс, плохой выбор слов, я полагаю. После этого окончательное удаление происходит из-за авторекламы, а исключение BAD ACCESS появляется во время [super dealloc]. Однако это исключение не появляется вообще, когда NSZombie включен. Я был в предположении, что NSZombie извергнет консоль в этих обстоятельствах. Это неправильно? –

+1

Вы правы. если я делаю [[[NSObject new] autorelease] release]; i См. сообщение «*** - [NSObject release]: сообщение отправлено на освобожденный экземпляр 0x100208580», что более полезно, чем «Сигнал, полученный программой»: «EXC_BAD_ACCESS». » что я получаю, если зомби отключены. – hooleyhoop

+0

mustISignUp: Это не связано с зомби. Все зависит от синхронизации: если что-то выделяет и записывает память, ранее занятую объектом, прежде чем отправить сообщение, вы получите сообщение об ошибке с плохим доступом. Если ничего еще не сделано, вы получите сообщение «сообщение отправлено на освобожденный экземпляр». Это верно, даже когда NSZombieEnabled отключен. –

-1

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

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

+0

Сохранение/освобождение все еще происходит, но когда -dealloc происходит, память не освобождается, вместо этого класс объекта изменяется на специальный класс зомби, который сразу же будет кричать на вас, если вы попросите его что-либо сделать. http://www.mikeash.com/pyblog/friday-qa-2011-05-20-the-inner-life-of-zombies.html –

0

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

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

1

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

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

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

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

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

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

Лучше и проще, однако, использовать шаблон Zombies для инструментов. Вместо сообщения, появляющегося в консоли отладчика Xcode, появится флаг в виде временной шкалы инструментов с информацией. У этого флага будет кнопка go-to-iTunes-Store (➲), которую вы можете щелкнуть для получения дополнительной информации о проблеме.

+0

Вы недопонимаете мою проблему. Я понимаю, что NSZombieEnabled заставляет объекты не умирать и будет (должен) выводить сообщение в журнал консоли, когда к объекту обращаются неправильно после его «мертвого». Однако проблема заключается в том, что вместо NSZombiesEnabled ничего не отображается в журнале консоли или в Инструментах. –

+0

То же самое для меня, кстати, я использую ARC, никакой релиз не сохраняется в моем коде, я не знаю, как я получаю сбой, я думаю, что невозможно с ARC –

+0

@ KukodaJános: Нет. Код не-ARC все еще можно вручную отпустить и сохранить, и по-прежнему можно переизбыть и все еще знать об объекте в ARC. Модифицировать приведения и 'assign' /' unsafe_unretained' свойства/переменные - два способа сделать это. Поэтому ARC не устраняет проблему, только усложняет ее реализацию, а Zombies остается способом исследования проблемы. Если Зомби ничего не перевернут, ваша проблема вообще не связана с объектами; «плохой доступ» имел какую-то другую память, и вам придется исследовать другой способ. –

Смежные вопросы