Probar:
int main(int argc, char *argv[])
{
NSLog(@"Step 0");
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSLog(@"Step 1");
int retVal = UIApplicationMain(argc, argv, nil, nil);
NSLog(@"Step 2");
[pool release];
NSLog(@"Step 3");
return retVal;
}
Puede ser que la liberación de la piscina es la prevención de la tala de árboles en cuyo caso se obtendría el paso 2, pero no el paso 3.
Si el paso 2 ISN' Si se está imprimiendo, es casi seguro que algo está mal con UIApplicationMain; existe la posibilidad de que no vuelva, por lo tanto, coloque las declaraciones NSLog (paso 1.1, paso 1.2, ...) en varios puntos y ejecútelo para encontrar el último mensaje .
Seguir perforando (Paso 1.7.1, 1.7.2, .... 1.7.6.3.2, ...) - con el tiempo, rastreará la línea exacta (independientemente de la profundidad de la jerarquía de llamadas) cuando los mensajes de registro dejan de registrarse y esa línea será su culpable (ya sea "apagar" el registro o salir sin regresar normalmente).
Un fragmento más me encontré en la web:
=====
Cuando se utiliza esta línea:
int retVal = UIApplicationMain(argc, argv, @"MyApp", @"MyApp");
La primera MiApl es su principal aplicación clase delegado. El segundo es la clase a la que SpringBoard envía notificaciones táctiles.
Además, si usa el SDK, y tiene una punta principal definida en la información.plist, entonces usted puede dejar la llamada como:
int retVal = UIApplicationMain(argc, argv, nil, nil);
como todo lo que será cubierto al crear sus xibs.
=====
Ahora no sé lo suficiente sobre el desarrollo del iPhone (xibs específicamente) para saber lo que el último bit incluso medios (o si se ha configurado correctamente) pero suena como otra fase de compilación.
Sin embargo, mi primer pensamiento al leer esto es que Springboard llamará a su clase de delegado cuando se presionen los botones para pedirle que haga algo (como cerrar con gracia). Si no puede preguntarle (es decir, sin delegado), es probable que tenga derecho a cerrarlo como lo considere oportuno, como con [UIApplication _terminateWithStatus:]
.
En el mundo de Windows, probablemente envíe un mensaje de renuncia a la ventana principal, pero, como ya dije, el desarrollo de iPhone puede ser diferente.
Aún así, es una avenida para investigar. Me interesaría ver qué llamadas se hicieron a un delegado si me proporcionó uno. El código incluido en el fragmento anterior tenía esto:
@implementation MyApp
- (void) applicationDidFinishLaunching:(id)unused {
rect = [ UIHardware fullScreenApplicationContentRect ];
rect.origin.x = 0.0f;
rect.origin.y = 0.0f;
window = [ [ UIWindow alloc ] initWithContentRect: rect ];
[ window makeKeyAndVisible ];
view = [ [ MyAppView alloc ] initWithFrame: rect ];
[ window setContentView: view ];
}
- (void) dealloc {
[ window release ];
[ view release ];
[ super dealloc ];
}
Así que tal vez un delegado con dealloc()
es el secreto para conseguir que salga de nuevo a main()
. ¿Por qué no le das una oportunidad? Puede acercarlo más a su objetivo, incluso si no resuelve el problema central.
Actualización: Me complace informar que Apple modificó la documentación oficial de UIApplicationMain() y cerró mi error. La documentación ahora incluye lo siguiente: aunque se especifique un tipo de retorno entero, esta función nunca regresa. Cuando los usuarios finalizan una aplicación de iPhone presionando el botón de Inicio, la aplicación sale inmediatamente llamando a la función del sistema de salida con un argumento de cero. " –