2010-07-21 25 views
7

Moja aplikacja iPhone sporadycznie ulega awarii podczas pierwszego uruchomienia po zainstalowaniu. Potem za każdym razem, gdy próbuję uruchomić aplikację, pozostaje na ekranie powitalnym lub nawet na czarnym ekranie, aż w końcu umiera. Muszę ponownie uruchomić urządzenie, aby aplikacja działała. Po tym działa dobrze za każdym razem. Jedyną zmianą między kodem OS3 a 4 jest właściwość "UIApplicationExitsOnSuspend", aby wymusić ponowne ładowanie aplikacji za każdym razem, zamiast zawieszania. Każda pomoc byłaby świetna.Awaria aplikacji na telefon iPhone (tylko iOS4)

Oto fragmenty dwóch Code:

- (void)applicationDidFinishLaunching:(UIApplication *)application 
{ 
    taskListViewController = [[TaskListViewController alloc] initWithNibName:@"TaskListView" bundle:nil]; 
    taskListViewController.managedObjectContext = self.managedObjectContext; 

    [taskListViewController setAppDefaults]; 

    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:taskListViewController]; 
    [taskListViewController release]; 

    navController.navigationBar.tintColor = [UIColor blackColor]; 

    [window addSubview:[navController view]]; 
    [window makeKeyAndVisible]; 

}

- (void)viewDidLoad 
{ 
    NSLog(@"viewDidLoad - Start"); 
    [super viewDidLoad]; 

    NSError *error = nil; 
    if(![[self fetchedResultsController] performFetch:&error]) 
    { 
    NSLog(@"Error with initial fetch %@, %@", error, [error userInfo]); 
    } 

    [activityIndicator startAnimating]; 

    self.navigationItem.leftBarButtonItem.enabled = NO; 
    self.navigationItem.rightBarButtonItem.enabled = NO; 
    infoButton.enabled = NO; 
    syncButton.enabled = NO; 

    taskListTable.userInteractionEnabled = NO; 
    taskListTable.allowsSelection = NO; 

    checkingRecovery = true; 
    [self insertCheck]; 
} 

inne metody wymienione powyżej:

[taskListViewController setAppDefaults] 
    [self insertCheck]; 

setAppDefaults - Wylicza poprzez ustawienia wiązki stosowania defaultValues ​​do NSUserDefaults jeśli nie zostały już ustawione przez użytkownika w pikselach.

insertCheck - wykonuje pewne zapytania na db, aby zapewnić integralność plików na nagraniach audio, ale w tym przypadku, ponieważ po raz pierwszy aplikacja jest ładowana, nie zrobi nic.

Aktualizacja:

Mam wykomentowane dodatkowych połączeń metodą (powyżej dwóch) i jestem nadal ma problem.

Znalazłem kilka osób mających ten sam rodzaj problemu na forum twórców jabłek bez rozwiązań. Jedna odpowiedź pochodzi od użytkownika mającego ten sam problem, ale aplikacja została zatwierdzona w sklepie z aplikacjami.

Dzięki Sj

+0

Możesz edytować swój wpis, aby dołączyć kod do tego, co dzieje się w twoich metodach 'applicationDidFinishLaunching' i' viewDidLoad'. Upewnij się również, że nie masz żadnych 'NSLogs' z niepoprawnymi ciągami danych w formacie danych (% d, gdy na przykład powinno być% @), mogą one powodować awarię bez wyświetlania komunikatów o błędach. – iwasrobbed

+0

Ładowanie okna wygląda normalnie, powiedziałbym, jeśli nie jest to spowodowane domyślnymi ustawieniami użytkownika, rozpocznij debugowanie kodu sprawdzania bazy danych lub początkowych wyników pobierania. – iwasrobbed

Odpowiedz

0

Czy przejrzałeś pliki dziennika?

Możesz je skopiować z iPhone'a, jeśli go włączysz, załadujesz organizer (Windows-> Organizator w XCode) i wybierzesz logi urządzeń.

Jeśli widzisz dziennik po raz zgłoszenie awarii, powinien on zawierać stos wywołań (która powinna obejmować funkcję powodując awarię)

Alternatywnie może być, że utkniesz w jakimś uruchomienie kodu przy uruchomieniu - i jeśli twoja aplikacja nie uruchomi się we właściwym czasie (w ciągu 30 sekund IIRC) iOS go zabije.

+0

Wygląda na to, że nie ma żadnych dzienników awarii dotyczących aplikacji. Dzięki. – Sjblack

+0

Zauważyłem, że odinstalowanie aplikacji i ponowna instalacja bez restartu urządzenia nie rozwiązuje problemu! Dzięki jeszcze raz. – Sjblack

0

Wypróbuj bez elementu managedObjectContext i sprawdź, czy nadal się zawiesza. Co mówi dziennik po awarii? Czy otrzymujesz wyjątek pamięci?

1

Jeśli debugujesz aplikację po awarii, powinieneś uzyskać ślad stosu, który pokaże ci, w której linii aplikacja się zawiesza.

Jeśli możesz podać ślad stosu, znacznie łatwiej będzie znaleźć przyczynę awarii.

+0

Obawiam się, że po awarii nie osiągnął punktu wejścia aplikacji w kodzie, więc nie otrzymuj żadnych dzienników awarii. Dzięki - Sj – Sjblack

Powiązane problemy