2010-10-15 3 views
9

Quando si crea un progetto iOS per iPhone predefinito in xCode, si ha un main.m in "Altre fonti" nel pannello laterale in xCode. In che modo int main() lì usa argc e argv e perché ne ha bisogno?In che modo iOS utilizza argc e argv?

Grazie :)

risposta

0

penso che siano disponibili solo perché i compilatori li usano, ma nel caso in cui iOS sono solo inutili, dal momento che non c'è modo diretto per aggiungere dinamicamente argomenti invocati app su iPhone. O almeno suppongo ..

+0

Hmm, pensiero interessante. ok grazie per la risposta. Spero che qualcuno abbia un po 'più di intuizione. grazie ancora! – Tim

6

Apri le informazioni del tuo eseguibile. Nella scheda degli argomenti c'è arguments to be passed on launch:. Se aggiungi qualcosa, verrà passato alla tua app.
Apple ha creato alcuni argomenti che hai inserito e modificano il comportamento dell'app. Ad esempio, -com.apple.CoreData.SQLDebug 1 stamperà alcuni messaggi di debug sql se si utilizza coredata. Sono sicuro che ci sono più argomenti di debug

int count; 
for (count = 0; count < argc; count++) 
{ 
    NSLog(@"argv[%d] = %s\n", count, argv[count]); 
} 

MODIFICA: questi argomenti vengono utilizzati solo se si avvia l'applicazione con xcode.

+0

Scusate, sono nuovo di questo. Quale file è l'eseguibile in un modello iOS predefinito? – Tim

+0

Nella barra laterale xcode ci sono diversi gruppi, uno è denominato come il tuo progetto, e ci sono Obiettivi, Eseguibili, Trova Risultati e così via. Apri il gruppo Eseguibili, dovrebbe esserci un elemento, il tuo eseguibile. Fai doppio clic per accedere alle informazioni. –

+0

Ah, capisco. Grazie ~ – Tim

0

Questa è solo una manifestazione di Objective-C è un superset di C.

In Mac OS X, è possibile utilizzare questo per passare gli argomenti a un app chiamandola dal Terminal, come ad esempio (probabilmente non funzionante):

/Applications/iTunes.app/Contents/MacOS/iTunes my args to application 

Su iOS, non è possibile lanciare app dalla riga di comando.

+0

Questo è quello che stavo pensando. Quindi non stanno davvero facendo nulla nel progetto, sono lì solo di default? – Tim

2

See: http://developer.apple.com/library/ios/#documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/Introduction/Introduction.html

I parametri argc e argv contengono argomenti lancio in tempo passati l'applicazione dal il sistema. Questi argomenti vengono analizzati dall'infrastruttura UIKit e possono essere altrimenti ignorati .

Fondamentalmente UIApplicationMain() crea un Singleton UIApplication oggetto che è anche consegnato l'oggetto delegato Application. Non specificano il protocollo di inizializzazione nei documenti, ma sembra che argc/argv venga passato a UIApplication durante una sorta di inizializzazione e quindi UIApplication li analizza e li trasforma in informazioni (forse opzioni di lancio) a cui è possibile accedere tramite UIApplication.

In ogni caso argc/argv sono praticamente riservati per l'utilizzo del sistema nelle applicazioni iOS. Il sistema sembra usarli per passare roba a UIApplication, essenzialmente.

EDIT

Come esperimento, ho inserito il seguente nella mia funzione main():

for (int i; i < argc; i++) 
    NSLog(@"%s", argv[i]); 

Quando ho lanciato nel simulatore semplicemente stampato un "argomento" (argv [ 0]) che è il percorso dell'applicazione.

Sospetto che se si inserisce qui e si avvia un'applicazione che registra un gestore di URL o si apre a causa di una notifica locale o di qualche altro evento di sistema, verrà visualizzato l'URL o qualsiasi altra opzione relativa all'apertura dell'applicazione . Comunque tu sei non supposto di analizzare argc/argv [] te stesso! Utilizzare le opzioni di avvio dell'applicazione fornite con il metodo UIApplicationDelegate application:didFinishLaunchingWithOptions:.

+0

L'ho appena verificato e quando la mia app viene avviata tramite "open in" non vengono passati argomenti all'app. –

+0

Oh bene, immagino che la mia ipotesi fosse sbagliata. Sono curioso però, hai una lista completa di opzioni di debug valide come la cosa -com.apple.CoreData.SQLDebug? Non sapevo che esistesse e potrebbe tornare utile per me. – Nimrod