UIButton, созданный Интерфейсным Разработчиком, терпит крах
Я сузил некрасивую ошибку, но поскольку она кажется чем-то внутренним для nib / Interface Builder, я не знаю, что делать дальше.
У меня есть UIView, созданный в IB, который функционирует как пользовательское диалоговое окно. Это показывает сообщение и две кнопки. (Продолжить или Отмена.) Обе кнопки имеют Фоновое изображение, установленное в Интерфейсном Разработчике.
Что-то не так с обработкой фонового изображения для кнопки отмены. С NSZombieEnabled я запускаю программу. Чаще всего метод ниже регистрирует это:
-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
dialogCancelButtonBackground <UIImage: 0x3b3a920>
Это совершенно нормально. Тем не менее, иногда это происходит (я могу заставить это повторить несколько надежно, если я «тороплю» интерфейс, быстро нажимая некоторые кнопки интерфейса):
-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
*** -[UIImage retain]: message sent to deallocated instance 0x3b3a920
Как вы можете видеть, NSZombieEnabled обнаружил, что фоновое изображение для кнопки «Отмена» было освобождено, но отправляется сообщение сохранения. (Не мной, хотя ... это изображениетолько используется для этой кнопки, итолько Доступ в Интерфейсном Разработчике. У меня нет ни IBOutlets, ни каких-либо переменных, связанных с этим изображением.)
Ну и что теперь?
РЕДАКТИРОВАТЬ:Иногда это не удерживающее сообщение, которое ловится как зомби, иногда это isKindOfClass:
//(the object address is always dialogCancelButton.currentBackgroundImage)
-[UIImage isKindOfClass:]: message sent to deallocated instance 0x1661f0
//occasionally, these come along, too:
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement methodSignatureForSelector: -- trouble ahead
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement doesNotRecognizeSelector: -- abort
Это мой пользовательский метод UIViews "showInView":
- (void)showInView:superView
title:(NSString*)title
message:(NSString*)message
cancelText:(NSString*)cancelText
proceedText:(NSString*)proceedText {
NSLog(@"%s",__PRETTY_FUNCTION__);
NSLog(@"dialogProceedButton %@", dialogProceedButton);
NSLog(@"dialogProceedButtonBackground %@", dialogProceedButton.currentBackgroundImage);
NSLog(@"dialogCancelButton %@", dialogCancelButton);
NSLog(@"dialogCancelButtonBackground %@", dialogCancelButton.currentBackgroundImage);
CGRect rect;
dialogTitle.text = title;
dialogMessage.text = message;
[dialogProceedButton setTitle:proceedText forState:UIControlStateNormal];
if (cancelText == @"") { // SINGLE BUTTON DIALOG
dialogCancelButton.hidden = YES;
rect = [dialogProceedButton frame];
rect.origin.x = 195; //center the button
[dialogProceedButton setFrame:rect];
} else {
[dialogCancelButton setTitle:cancelText forState:UIControlStateNormal];
dialogCancelButton.hidden = NO;
rect = [dialogProceedButton frame];
rect.origin.x = 286; //button on right of dialog box
[dialogProceedButton setFrame:rect];
}
[UIView beginAnimations:@"modalAppears" context:nil];
[UIView setAnimationDuration:0.5];
[superView addSubview:self];
self.alpha = 1.0;
[UIView commitAnimations];
}
Спасибо!