Quindi, come già menzionato, la funzione main()
in main.m
è il punto di partenza, che quindi chiama UIApplicationMain()
. Se si controlla i documenti, vedrai che UIApplicationMain
prende quattro argomenti:
- argc,
- * argv [],
- * principalClassName
- * delegateClassName.
I primi due di questi sono solo il conteggio degli argomenti e l'elenco delle variabili passato da main()
. Ma il terzo e il quarto argomento sono puntatori a NSStrings. Il terzo argomento specifica quale classe deve essere UIApplication
. A meno che non si intenda sottoclasse UIApplication
, si specifica nil
per il terzo argomento.Il quarto argomento specifica quale classe deve essere la classe delegato di UIApplication, che risponderà a qualsiasi cosa specificata nel protocollo UIApplicationDelegate
. Non dovete fare muck con questo direttamente, come è incluso in tutti i modelli di Xcode:
int main(int argc, char *argv[])
{
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
}
}
Non lasciate che il bit NSStringFromClass([AppDelegate class]))
si getta. Questo è solo un modo ingegnoso per specificare il quarto argomento in modo che venga chiamato il delegato giusto in caso di modifica successiva del nome di AppDelegate.m
.
UIApplication
avvia main event loop e chiama -application:didFinishLaunchingWithOptions:
, uno dei metodi che il suo delegato deve gestire. Dai uno sguardo allo AppDelegate.m
e troverai del codice template per questo metodo. Questo è dove si può iniziare la personalizzazione, la creazione di cose che devono essere a posto prima che gli altri UIWindow
e istanze di UIView
vengono creati:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
// Override point for customization after application launch.
self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
self.window.rootViewController = self.viewController;
[self.window makeKeyAndVisible];
return YES;
}
Così, ora la finestra dell'applicazione e la vista della radice del controller vengono definiti, e l'applicazione è spento e funzionante.
Tutto questo, e un bel po 'di più, è ottimamente spiegato qui: http://oleb.net/blog/2012/02/app-launch-sequence-ios-revisited/
FYI, 'UIApplicationMain()' non ritorna mai. L'app è terminata tramite una chiamata a 'exit()'. Quindi tutto ciò che mettete dopo 'UIApplicationMain (argc, argv, nil, nil);' in 'main()' non * mai * verrà eseguito. Mai e poi mai. –
Ugh. @Dave se è vero, questo mi fa davvero impazzire. È come tornare ai tempi di BASIC quando abbiamo messo STOP nel mezzo di un GOSUB! –