UIButton, yang dibuat oleh Interface Builder, mogok

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!


person Rob    schedule 15.10.2009    source sumber


Jawaban (2)


Oke, yang ini apa-apaan. Saya memutuskan untuk mencoba membalikkan gambar untuk tombol Lanjutkan dan Batal. Hasilnya sekarang adalah gambar tombol Lanjutkan akan menyebabkan kerusakan (dan kadang-kadang juga). Saya sepenuhnya menghapus gambar dari proyek saya dan dari Interface Builder. Saya kemudian menambahkan salinan baru dengan nama baru dan menghubungkannya.

Dengan pengaturan sebelumnya, saya mampu mereproduksi kerusakan sekitar 40% dari keseluruhan waktu. Saya telah mencoba sekitar 20 kali untuk mereproduksi kerusakan setelah perubahan ini, dan saya tidak dapat mereproduksinya sama sekali sekarang.

Jika gambar atau ujung pena rusak, mengapa, mengapa, mengapa menyebabkan gejala acak/intermiten?

Apa-apaan. Semoga baik-baik saja dan benar-benar diperbaiki.


Memperbarui:

Dan... jadi ada sedikit lebih dari itu. Ternyata saya menemukan bahwa saya telah secara kebetulan menggunakan gambar yang sama sebagai placeholder dalam tampilan instruksi saya (yang tidak lengkap). Untuk kenyamanan sementara, saya menggunakan [UIImage imageNamed:] untuk mengambil gambar. Itu telah dialokasikan dan dirilis dengan benar, tetapi tampaknya kerja sama IB dengan metode imageNamed: dan/atau cache tidak sempurna.

Fakta bahwa ketika saya mengambil salinan baru dari gambar tersebut, saya juga memberinya nama baru, berarti sekarang gambar tombol IB dan gambar placeholder sementara bukan lagi gambar yang sama sama sekali .

Saya kembali ke cadangan proyek saya beberapa hari yang lalu untuk menguji teori saya. Yang saya lakukan hanyalah memberi tahu tampilan instruksi untuk menggunakan gambar placeholder yang berbeda. Kecelakaan berhenti.

Ini mungkin bug SDK. Seharusnya tidak ada alasan untuk tidak menggunakan gambar di IB dan juga menggunakan gambar yang sama di tempat lain menggunakan imageNamed:. Jika suatu hari nanti saya merasa cerdik atau bosan, mungkin saya akan menyaringnya menjadi proyek contoh untuk dikirim ke radar Apple.

person Rob    schedule 16.10.2009
comment
Ini tampaknya sangat, sangat tidak mungkin bagi saya - Saya rasa banyak orang menggunakan nama gambar dan IB sepanjang waktu. Akan menarik untuk mengujinya. - person Kendall Helmstetter Gelner; 17.10.2009

Bagaimana file XIB Anda dihubungkan ke tampilan Anda? IBOutlet apa yang telah Anda tetapkan? Saya sangat ragu Anda telah menyelesaikan masalah Anda seperti yang Anda jelaskan.

person Kendall Helmstetter Gelner    schedule 16.10.2009
comment
Saya setuju bahwa sepertinya itu bukan penyebab (atau perbaikan) masalahnya, tetapi masalah itu tidak crash satu kali pun sejak saya melakukan satu hal itu. Saya mungkin akhirnya mencoba sekitar 50 kali untuk mereproduksi kecelakaan tersebut sebelum saya cukup yakin untuk melanjutkan. Sebelum perubahan, saya bisa mengalami kecelakaan setiap 2 hingga 4 kali saya mencobanya. mengangkat bahu. - person Rob; 16.10.2009
comment
(Tentu saja, masih ada lagi... lihat pembaruan di jawaban lengkap saya.) - person Rob; 17.10.2009