30 votes

Erreur de compilation du débogage de l'application iPhone / iPad universelle pour les tests iPhone

J'ai écrit un iPhone et iPad app universelle qui fonctionne très bien sur l'iPad simulateur sur Xcode, mais maintenant, j'aimerais tester les fonctionnalités de l'iPhone. Je ne semble pas en mesure d'exécuter le simulateur d'iPhone, avec ce code, comme il le fait toujours défaut à l'iPad?

Au lieu de cela j'ai essayé de courir sur l'appareil et qu'il commence à courir, j'obtiens l'erreur suivante:

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

Comme l'Application est développée par programme plutôt que d'utiliser XIB, j'ai divisé les 2 périphériques logiques en utilisant les lignes suivantes dans la main.m méthode:

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

À partir de ce moment-là, ils utilisent différents AppDelegates et j'ai vérifié mes en-têtes pour assurer la UISplitView n'est jamais utilisé ni importé via le Téléphone de la logique.

Comment puis-je éviter cette erreur, et est-il une meilleure façon de diviser l'universel logique, des chemins par programme créé d'application?

66voto

Brad Larson Points 122629

Cette erreur est déclenchée parce que vous n'avez pas maillons faibles du framework UIKit. Le framework UIKit de l'iPhone OS 3.2 ajouté le UISplitViewController, et si vous avez un lien en tant normal de votre application bénéficiera de ces symboles existent sur 3.0, où ils ne sont pas.

À maillons faibles d'un cadre, de trouver votre application cible dans Xcode, l'inspecter, et aller à l'onglet Général. Au bas de cet onglet doit être une liste de cadres, avec une colonne de Type. Modifier le Type de UIKit de Tenu de la Faiblesse et de la reconstruction de votre application. Qui devrait prendre en charge les erreurs d'exécution.

Votre logique conditionnelle est bonne, mais j'ai tendance à partager une application de déléguer et de faire l'interface spécifique à la mise en page plus loin sur la ligne.

(Mise à jour: 12/21/2011) Comme de l'iOS 4.2, vous n'avez plus besoin de le maillon faible de cadres afin d'éviter des erreurs de ce genre. Comme Marco Arment décrit, si vous construisez avec iOS 4.2 ou version ultérieure et de la cible vers le bas de l'iPhone OS 3.1+, les cours individuels sont maintenant faibles liés et doivent avoir leur +class de retour de méthode nil si la classe n'existe pas sur le cours d'exécution de la version de l'OS.

4voto

xoconoxtle Points 115

J'ai eu un très semblables, d'erreur et il a été me rend fou! :-) La recherche pendant des heures et ne pouvait pas le comprendre...

Comme vous l'avez dit, tout s'était bien passé lors de l'exécution dans le Simulateur d'iPad mais lorsque j'essaie de tester l'Appli sur l'iPhone avec l'iPhone OS 3.1.2 il ne serait même pas le début, mais d'un plantage avec le message d'erreur suivant:

mi_cmd_stack_list_frames pas assez d'images dans la pile

En cochant presque chaque ligne de code que j'ai réalisé que l'allocation de 3.2 classes comme UIPopoverController ou UISplitViewController (déjà à l'intérieur de fourche iPad-code spécifique) a été à l'origine du problème.

Donc au lieu de dire:

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

je voudrais écrire

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

et qui a résolu mon problème! (Débogage peut être si difficile si le message d'erreur ne vous donne aucun indice sur l'endroit où le bug pourrait éventuellement être trouvé...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X