2012-04-15 3 views
3

У меня есть приложение для примера iphone с одной кнопкой. При нажатии на него набирается код:UIAlertView в приложении ARC

UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"test" 
          message:@"test" 
          delegate:self 
          cancelButtonTitle:@"Ok" 
          otherButtonTitles: nil]; 
[alert show]; 

Приложение имеет ARC.

Проблема в том, что если я нажму кнопку OK в сообщении, приложение выйдет из строя с EXC_BAD_ADDRESS - возможно, из-за предупреждения уже удалено дугой.

Что рекомендуется для решения этой проблемы? без добавления свойства в ViewController

благодаря

+3

Используйте инструмент «Зомби», чтобы узнать, где происходит авария. – edc1591

+4

Что вы на самом деле делаете в методе делегата, и где именно происходит сбой? –

ответ

5

Моей догадки либо вы не реализовали UIAlertViewDelegate метод или что сам вышел из сферы.

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

UIAlertView *alert = [[UIAlertView alloc] 
          initWithTitle:@"test" 
          message:@"test" 
          delegate:nil 
          cancelButtonTitle:@"Ok" 
          otherButtonTitles: nil]; 
[alert show]; 
5

Делегат свойство UIAlertView объявляется как слабое ссылки (обозначается Назначают ключевого слова). Это означает, что ARC не будет увеличивать счет сохранения, и вам нужно будет сохранить ссылку на объект делегата (будь то я или отдельный объект). Эта ссылка должна поддерживаться на весь срок службы UIAlertView.

@property(nonatomic,assign) id /*<UIAlertViewDelegate>*/ delegate; // weak reference 

Я полагаю, что причина этого заключается в том, чтобы предотвратить петлю и отказ освободить, как и в общем случае объект создания UIAlertView сохранит ссылку на него и быть это делегат, чтобы закрыть петлю и предотвращая высвобождение ,

Это, вероятно, общий образец для делегатов, но я не понял, пока не ударил точно такую ​​же проблему. Я побежал в симуляторе с включенным обнаружением зомби, и он четко обозначил количество отсчетов ссылок, и я увидел, что он не был сохранен UIAlertView. Это было, когда я проверил файл заголовка.

Ответ на этот вопрос дает дополнительную информацию о делегатах по системным классам и ключевому слову assign. iPhone ARC Release Notes - dealloc on system classes delegates?