2011-01-18 14 views
14

Ho appena iniziato a imparare lo sviluppo iOS e ora ho un sigabrt sulla mia funzione principale. L'errore si attiva chiamando:Sigabrt on Funzione principale

int retVal = UIApplicationMain(argc, argv, nil, nil); 

Come io sono molto nuovo alla programmazione iOS non ho idea su quello che potrebbe causando questo errore. Una cosa che ho trovato sul mio callstack è la seguente eccezione: dyld_stub_objc_exception_throw Che cosa potrebbe causare questo errore?

risposta

2

Era solo un errore tipico di qualcuno che impara una nuova lingua/API. Ho dimenticato di impostare correttamente la vista.

UIView *controllersView = [myViewController view]; 
[window addSubview:controllersView]; 
2

UIApplicationMain fondamentalmente prende il via dal resto dell'applicazione, quindi la causa effettiva del crash potrebbe essere ovunque nell'applicazione. Potrebbe essere necessario guardare più in basso nello stack delle chiamate.

Tuttavia, noto che stai passando nil come i due parametri finali. Il primo nil è l'argomento principalClassName, che può essere legalmente nullo se si desidera che UIApplication sia la classe principale. Il secondo nil è il nome del delegato dell'applicazione; devi passare nil se carichi il delegato dal pennino principale. Fai? Se non lo fai, quello potrebbe essere il problema (non posso dire di aver mai chiamato questa funzione con entrambi quegli argomenti nil).

+0

Ho provato a passare il nome del delegato ma non ci sono riuscito. Trovo che l'errore si verifichi prima che il mio codice possa girare didFinishLaunchingWithOptions non viene eseguito mai – Raphael

33

Avevo questo problema in X-Code 4.2 e il problema era che non riusciva a trovare il mio Storyboard. La parte frustrante era che non c'era alcuna indicazione su quale fosse l'eccezione reale. Sono stato in grado di ottenere l'eccezione nel registro aggiungendo un try/catch alla mia funzione principale. (Nota che sto usando ARC, quindi se non stai usando ARC il tuo aspetto sarà un po 'diverso con try catch)

int main(int argc, char *argv[]) 
{ 
    int retVal = 0; 
    @autoreleasepool { 
     NSString *classString = NSStringFromClass([sortaAppDelegate class]); 
     @try { 
      retVal = UIApplicationMain(argc, argv, nil, classString); 
     } 
     @catch (NSException *exception) { 
      NSLog(@"Exception - %@",[exception description]); 
      exit(EXIT_FAILURE); 
     } 
    } 
    return retVal; 
} 
+0

Questo è un vero toccasana, la mia app si aspettava un UITableViewController in cui stavo passando un UIViewController. – Echilon

+1

Raccomando anche NSLogging '[exception callStackSymbols];' per ottenere la traccia dello stack. Anche tu non hai la 'descrizione' di chiamata per la descrizione, puoi semplicemente andare su 'NSLog (@" Exception -% @ ", exception);' (Quando lo mandi in una stringa di formato come nslog). – apple16

+1

Questa tecnica è fantastica! Dovrebbe essere consigliato da tutti per aiutare a catturare simili eccezioni difficili da trovare. Ora aggiungo una macro DEBUG speciale a tutti i miei progetti per impostare questo tipo di segnalazione delle eccezioni. – jpap