Error de comstackción de depuración de aplicaciones de iPhone / iPad universal para pruebas de iPhone

He escrito una aplicación universal para iPhone y iPad que funciona bien en el simulador de iPad en Xcode, pero ahora me gustaría probar la funcionalidad del iPhone. Parece que no puedo ejecutar el simulador de iPhone con este código, ya que siempre está predeterminado en el iPad.

En cambio, traté de ejecutar en el dispositivo y, cuando comienza a ejecutarse, aparece el siguiente error:

dyld: Symbol not found: _OBJC_CLASS_$_UISplitViewController Referenced from: /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/Test Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/9770ACFA-0B88-41D4-AF56-77B66B324640/Test.app/TEST 

Como la aplicación se crea mediante progtwigción en lugar de usar XIB, he dividido las 2 lógicas del dispositivo usando las siguientes líneas en el método main.m:

 if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Pad"); } else { retVal = UIApplicationMain(argc, argv, nil, @"AppDelegate_Phone"); } 

A partir de ese punto, utilizan diferentes AppDelegates y he comprobado mis encabezados para asegurarme de que UISplitView nunca se use ni se importe a través de la lógica del teléfono.

¿Cómo puedo evitar este error y hay una mejor manera de dividir las rutas lógicas universales en esta aplicación creada mediante progtwigción?

Ese error se desencadena porque no vinculaste débilmente el marco UIKit. El marco UIKit en iPhone OS 3.2 agregó el UISplitViewController, y si lo vincula de forma normal su aplicación supondrá que esos símbolos existen en 3.0, donde no lo hacen.

Para vincular débilmente un marco, busque su objective de aplicación en Xcode, inspecciónelo y vaya a la pestaña General. En la parte inferior de esa pestaña debe haber una lista de marcos, con una columna para Tipo. Cambie el Tipo de UIKit de Requerido a Débil y reconstruya su aplicación. Eso debería encargarse de los errores de tiempo de ejecución.

Su lógica condicional es sólida, pero tiendo a compartir un delegado de aplicación y hacer el diseño específico de la interfaz más adelante en la línea.

(Actualización: 21/12/2011) A partir de iOS 4.2, ya no es necesario tener marcos de enlaces débiles para evitar errores como este. Como describe Marco Arment , si comstack con iOS 4.2 o posterior y se dirige al iPhone OS 3.1+, las clases individuales ahora están débilmente vinculadas y su método +class devolver nil si la clase no existe en la versión actual del OS.

¡Estaba teniendo un error muy similar y me estaba volviendo loco! 🙂 Buscando horas y no pudo resolverlo …

Como dijiste, todo estaba bien cuando se ejecutaba en el simulador de iPad, pero cuando intentabas probar la aplicación en el iPhone con iPhone OS 3.1.2, ni siquiera comenzaba, sino que se bloqueaba con el siguiente mensaje de error:

mi_cmd_stack_list_frames no hay suficientes cuadros en la stack

Al verificar casi cada línea de código, me di cuenta de que la asignación de 3.2 clases como UIPopoverController o UISplitViewController (que ya estaba dentro del código específico del bifurcado del iPad) estaba causando el problema.

Entonces, en lugar de, es decir:

infoPopover = [[UIPopoverController alloc] initWithContentViewController: infoNavController];

Yo escribiría

infoPopover = [[NSClassFromString (@ “UIPopoverController”) alloc] initWithContentViewController: infoNavController];

¡y eso resolvió mi problema! (La depuración puede ser tan difícil si el mensaje de error no le da ninguna pista sobre dónde se podría encontrar el error …)

Xcode 8.3, iPad 2 (no retina), código Swift 3

Lo que me ayudó fue:

  • reiniciar Xcode
  • hacer un ‘Product -> Clean’ Shift Command K
  • reconstruir el proyecto