2012-09-13 18 views
18

Niedawno przesłałem aplikację do sklepu App Store, która nie została jeszcze zaakceptowana. Tymczasem pobrałem Xcode 4.5 i przetestowałem moją aplikację w iPhone 6.0 Simulator.UIAlertView powoduje awarię w iOS SDK 6.0

Jednak, gdy zamierzam pokazać UIAlertView, aplikacja zawiesza się na linii [myAlertView show] z błędem EXC_BAD_ACCESS. Działa dobrze z iPhone 5.1 Simulator.

Oto mój kod:

UIAlertView *myAlertView = [[UIAlertView alloc] initWithTitle:@"Warning" message:@"Are you sure?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil]; 
[myAlertView show]; 

Czy to normalne? Co robię nie tak z moim kodem?

także, myślisz mam ponownie wysłać mojej aplikacji do Apple? (Tylko pytam twojej rady)

Z góry dzięki.

Edytuj: Apple odrzuciło aplikację z powodu awarii systemu iOS 6.

+1

próbowałeś czystą i świeżą build? Czy wyświetlasz widok alertu z wątku innego niż główny wątek, w którym musi znajdować się CAŁY kod UI, lub może on niespodziewanie ulec awarii? – Levi

+0

Wyświetlanie w wątku ... Czy to dlatego? Dlaczego tak się nie dzieje w 5.1? – kubilay

+0

@confeng Jeśli wywołasz ten kod z wątku innego niż mainthread, tak, to jest najprawdopodobniej przyczyną jego awarii. W przeciwnym razie kod jest w porządku. – JustSid

Odpowiedz

20

Zobacz ten powiązane pytanie: UIAlertView shown from background thread and with no delegate creates EXC_BAD_ACCESS

wejściowe użytkownika i interfejsu połączenia muszą pochodzić od głównego wątku. Wiele z nich będzie działać "najczęściej" w innych wątkach, ale czasami się zawiesza. Bardziej prawdopodobne jest, że ulegną one awarii (mniej lub bardziej często) na urządzeniu niż w symulatorze, ale możliwe jest, że Apple wprowadziło zmiany, które wpływają na tę różnicę w systemie iOS6.

I na twoje drugie pytanie, odpowiedziałbym tak, chciałbym przesłać zaktualizowany plik binarny do sprawdzenia zaraz po naprawieniu problemu, szczególnie jeśli możesz go odtworzyć na urządzeniu (zdecydowanie zachęcam do próby odtworzenia go na urządzeniu). W przeciwnym razie możesz A) zostać przyjętym z błędem, którego użytkownicy nienawidzą, lub B) zostać odrzuconym i mieć jeszcze dłuższe opóźnienie i być może więcej kontroli. Jeśli wyślesz zaktualizowaną wersję binarną przed zakończeniem recenzji, to przeniesie Cię ona na "powrót linii" AFAIK, ale lepiej niż alternatywy.

27

Usuń tę metodę i użyć innej metody:

[myAlertView show]; 

spróbować tej metody:

[myAlertView performSelectorOnMainThread:@selector(show) withObject:nil waitUntilDone:YES]; 
+0

to działa dla mnie, dzięki za to –

+0

To działa, ale problem, który mam, to kiedy użytkownik kliknie w porządku, alert zniknie - dobrze, ale ich nadal jest wyblakłym tłem, które wciąż pojawia się, ale znika, gdy użytkownik klika gdzieś w głównym widoku, który wyświetlał alert ..... Jakieś pomysły? Jak [ukryj alarm], gdy użytkownik kliknie w porządku w widoku alertu? – jsetting32

+0

Działa dobrze ... * tylko, jeśli bieżąca aktywność nie jest w głównym wątku :-) –

Powiązane problemy