UIButton, criado pelo Interface Builder, está falhando

Eu reduzi um bug feio, mas como parece algo interno ao nib / Interface Builder, eu não sei o que fazer a seguir.

Eu tenho um UIView criado em IB que funciona como uma caixa de diálogo personalizada. Mostra uma mensagem e dois botões. (Prosseguir ou Cancelar.) Ambos os botões têm uma imagem de fundo definida no Interface Builder.

Algo está errado com a maneira como a imagem de fundo do botão de cancelamento está sendo manipulada. Com NSZombieEnabled, eu tenho executado o programa. Na maioria das vezes, o método abaixo registra isso:

-[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>

Isso é completamente normal. No entanto, às vezes isso acontece (posso fazer com que isso se repita de maneira confiável se eu "apressar" a interface do usuário tocando rapidamente em alguns botões da interface):

-[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

Como você pode ver, NSZombieEnabled descobriu que a imagem de fundo do botão Cancelar foi desalocada, mas está sendo enviada uma mensagem de retenção. (Não por mim, entretanto ... essa imagem ésó usado para este botão, esó acessado no Interface Builder. Eu não tenho nenhum IBOutlets ou quaisquer variáveis ​​ligadas a essa imagem.)

Então, e agora?

EDITAR:

Às vezes, não é uma mensagem de retenção que é pego como um zumbi, às vezes é 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

Este é o meu método personalizado "showInView" do UIViews:

- (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];
}

Obrigado!

questionAnswers(2)

yourAnswerToTheQuestion