Saya telah mempersempit bug yang jelek, tetapi karena sepertinya ada sesuatu yang internal pada ujung pena/Pembangun Antarmuka, saya tidak tahu apa yang harus saya lakukan selanjutnya.
Saya telah membuat UIView di IB yang berfungsi sebagai kotak dialog khusus. Ini menunjukkan pesan dan dua tombol. (Lanjutkan atau Batalkan.) Kedua tombol memiliki gambar Latar Belakang yang diatur di Pembuat Antarmuka.
Ada yang salah dengan cara penanganan gambar latar belakang untuk tombol batal. Dengan NSZombieEnabled, saya telah menjalankan programnya. Paling sering, metode di bawah mencatat ini:
-[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>
Itu sangat normal. Namun, kadang-kadang ia melakukan hal ini (saya bisa mengulanginya dengan andal jika saya "memburu" UI dengan mengetuk cepat beberapa tombol antarmuka):
-[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
Seperti yang Anda lihat, NSZombieEnabled menemukan bahwa gambar latar belakang untuk tombol Batal telah dibatalkan alokasinya, tetapi sedang dikirimi pesan simpan. (Namun, tidak bagi saya... gambar itu hanya digunakan untuk satu tombol ini, dan hanya diakses di Pembuat Antarmuka. Saya tidak memiliki IBOutlet atau variabel apa pun ditautkan ke gambar itu.)
Jadi, um, bagaimana sekarang?
Sunting:
Terkadang, bukan pesan simpanan yang tertangkap sebagai zombie, terkadang 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
Ini adalah metode "showInView" UIViews khusus saya:
- (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];
}
Terima kasih!