2010-10-15 28 views
9

Cuando crea un proyecto de iphone OS predeterminado en xCode, tiene un main.m en "Otras fuentes" en el panel lateral en xCode. ¿Cómo funciona el int main() allí usando argc y argv y por qué lo necesita?¿Cómo usa el iOS argc y argv?

Gracias :)

Respuesta

0

creo que están disponibles sólo porque los utilizan compiladores pero en el caso de iOS son sólo inútil, ya que no hay forma directa de añadir dinámicamente argumentos que invoca la aplicación en el iPhone. O al menos, supongo ...

+0

Hmm, pensamiento interesante. ok gracias por la respuesta. Espero que alguien tenga un poco más de conocimiento. ¡gracias de nuevo! – Tim

6

Abre la información de tu ejecutable. En la pestaña de argumentos hay arguments to be passed on launch:. Si agrega algo allí, se pasará a su aplicación.
Apple creó algunos argumentos que usted pone allí y cambian el comportamiento de la aplicación. -com.apple.CoreData.SQLDebug 1, por ejemplo, imprimirá algunos mensajes de depuración SQL si usa coredata. Estoy seguro de que hay más argumentos de depuración

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

EDIT: estos argumentos sólo se utilizan si se inicia la aplicación con Xcode.

+0

Lo siento, soy nuevo en esto. ¿Qué archivo es el ejecutable en una plantilla predeterminada de iOS? – Tim

+0

En su barra lateral xcode hay varios grupos, uno recibe el nombre de su proyecto, y hay Destinos, Ejecutables, Resultados de búsqueda, etc. Abra el Grupo de ejecutables, debe haber un elemento, su ejecutable. Haz doble clic en él para acceder a la información. –

+0

Ahh ya veo. Gracias ~ – Tim

0

Esta es sólo una manifestación de Objective-C es un superconjunto de C

En Mac OS X, puede usar esto para pasar argumentos a una aplicación llamándolo desde la terminal, tales como (probablemente no funciona):

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

En iOS, no hay posibilidad de iniciar aplicaciones desde la línea de comandos.

+0

Eso es lo que estaba pensando. Entonces, ¿realmente no están haciendo nada en el proyecto, solo están ahí por defecto? – Tim

2

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

Los parámetros argc y argv contienen ningún argumento en tiempo de lanzamiento pasados ​​a la aplicación de el sistema. Estos argumentos son analizados por la infraestructura UIKit y de lo contrario pueden ignorarse .

Básicamente UIApplicationMain() crea un objeto único UIApplication que también se entregó el objeto delegado de aplicaciones. No especifican el protocolo de inicialización en los documentos, pero parece que argc/argv pasa a UIApplication durante algún tipo de inicialización y luego UIApplication los analiza y los convierte en información (tal vez opciones de inicio) a los que se puede acceder a través de UIApplication.

En cualquier caso, argc/argv está prácticamente reservado para el uso del sistema en aplicaciones iOS. El sistema parece usarlos para pasar cosas a UIApplication, esencialmente.

EDITAR

A modo de experimento, que incluye el siguiente texto en mi función main():

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

Cuando lancé en el simulador simplemente imprime un "argumento" (argv [ 0]) que es la ruta de la aplicación.

Sospecho que si pone esto aquí y abre una aplicación que registra un manejador de URL o abre debido a una notificación local u otro evento del sistema, verá la URL o las opciones relacionadas con la forma en que se abrió la aplicación . Sin embargo usted es supone no para analizar argc/argv [] sí mismo! Use las opciones de inicio de la aplicación provistas en el método UIApplicationDelegate application:didFinishLaunchingWithOptions:.

+0

Acabo de comprobar eso, y cuando mi aplicación se inicia a través de "abrir en" no se pasan argumentos a la aplicación. –

+0

Oh, bueno, supongo que mi suposición era incorrecta entonces. Aunque tengo curiosidad, ¿tiene una lista completa de opciones de depuración válidas como la de -com.apple.CoreData.SQLDebug? No sabía que existía y podría ser útil para mí. – Nimrod