2010-04-05 25 views
7

Uygulamamız, zor olduğunu kanıtlayan bir hata nedeniyle 1,500 sürümde yaklaşık 1 frekansla çöküyor. Yığın izinin ilgili kısmı dahildir. Bir geri arama olarak kovuluyor, bu yüzden kendi kodumda nerede olduğuyla ilgili bir referansım yok.UIAlertView, belgelenmemiş yöntemde çöküyor

Neler olduğunu görüyor, UIAlertView's özel yöntemini (_popoutAnimationDidStop:finished:) arayarak bir UIViewAnimationState nesnesi var. Tek sorun, UIAlertView'un bu noktadan ayrıldığı görülüyor. Uyarı görüntüleriyle garip bir şey yapmıyorum. Onları fırlatırım ve kullanıcı girdisini bekliyorum. Hepsi serbest bırakılmadan önce gösterilir.

Bunu herkes karşılaştı mı? Bu noktada, bir Apple hatası olmak için ona yaslanmışım.

Thread 0 Crashed: 
0 libobjc.A.dylib     0x3138cec0 objc_msgSend + 24 
1 UIKit       0x326258c4 -[UIAlertView(Private) _popoutAnimationDidStop:finished:] 
2 UIKit       0x324fad70 -[UIViewAnimationState sendDelegateAnimationDidStop:finished:] 
3 UIKit       0x324fac08 -[UIViewAnimationState animationDidStop:finished:] 
4 QuartzCore      0x311db05c run_animation_cal 

lbacks

+0

Hata ayıklayıcıda alınan hatayı hatırlıyor musunuz? muhtemelen oldu: [* responseSToSelector:]: mesaj ayrılan örneğine gönderildi – Cole

cevap

12

O UIAlertView o temsilci serbest bırakıldıktan sonra temsilci bir yöntemi çağırmak için çalışıyor olasıdır. Bu tür bir hatayı önlemek için, bir nesneyi başka bir nesnenin temsilci olarak ayarladığınız zaman, temsilci özelliği delegenin nesnesinin dealloc yönteminde sıfırlanacak şekilde ayarlayın. Örneğin.


@implementation YourViewController 
@synthesize yourAlertView; 

- (void)dealloc { 
    yourAlertView.delegate = nil; // Ensures subsequent delegate method calls won't crash 
    self.yourAlertView = nil; // Releases if @property (retain) 
    [super dealloc]; 
} 

- (IBAction)someAction { 
    self.yourAlertView = [[[UIAlertView alloc] initWithTitle:@"Pushed" 
         message:@"You pushed a button" 
         delegate:self 
         cancelButtonTitle:@"OK" 
         otherButtonTitles:nil] autorelease]; 
    [self.yourAlertView show]; 
} 

// ... 

@end 
+1

Mükemmel teşekkürler. Açıkça bir çözüm, UIAlertView'ın bir şekilde erken bırakıldığının varsayımı üzerine yeni bir şey yaptım. Bazen sadece başka bir göz seti almanız gerekir. Buna rastlayan başka biri için, deterministik olmayan bir şekilde (örneğin bağlantı kaybıyla) itilip atılabilen bir gezinme yığını kullanıyorsanız, her zaman delege grubunuzdaki tüm delegeleri kaldırmanız gerektiğini unutmayın. Apple bu örnekleri örnek projelerinde doğru bir şekilde göstermemektedir. – DougW

+3

Aynı sorunla karşı karşıyayım, AlertView yerel değişken olarak bildirildiğinde, bunun nasıl çözüleceğine işaret edebilir. Temsilciyi temsilci geri çağırmasında sıfırlamak zorunda mıyız? – rustylepord

+0

ARC modunda derlenmiş uygulamalarda bile bunun olması ilginç. Apple, tüm delege benzeri özellikler için önerdiği gibi UIAlertView öğesinin temsilci özelliğini güvenli bir şekilde neden zayıflatmadı? – Lukasz

İlgili konular