Application créer sous lion ne fonctionne pas sous léopard ni Snow

cocoacola71cocoacola71 Membre
mars 2012 modifié dans API AppKit #1
Bonjour à  tous.



Tout d'abord Mac et Xcode (Cocoa, Objective-c) était totalement nouveau pour moi, j'ai lu bcp de tutoriels, vu de nombreuses vidéos de formation. Mais je pense que le forum est indispensable et encore plus lorsque les participants prennent le temps de répondre.

C'est pourquoi j'aimerai remercier la communauté CocoaCafé pour l'aide que vous m'avez apporté.

Je ne pense pas que j'aurai réussi ni même compris certaines étapes de mon application sans ce forum et ses participants. image/implore.gif' class='bbc_emoticon' alt=' o:) ' />



Voici un soucis qui m'inquiète bcp!

J'ai donc créé une application sous 10.7 avec Xcode 4.2. Celle ci est bien-sur en Version Test, et c'est pour cela que j'ai voulu la tester sous 10.6. Voici donc les étapes que j'ai fait:

- J'ai modifié le Deployment Target du projet : 10.6

- Copier le .app sur le bureau du Mac Snow Léopard.

- Lancer

Et une erreur survient:
<br />
Exception Type:  EXC_BREAKPOINT (SIGTRAP)<br />
Exception Codes: 0x0000000000000002, 0x0000000000000000<br />
Crashed Thread:  0  Dispatch queue: com.apple.main-thread<br />
Application Specific Information:<br />
*** Terminating app due to uncaught exception &#39;NSInternalInconsistencyException&#39;, reason: &#39;Invalid parameter not satisfying: aString &#33;= nil&#39;<br />
*** Call stack at first throw:<br />
(<br />
	0   CoreFoundation					  0x971736ca __raiseError + 410<br />
	1   libobjc.A.dylib					 0x989c95a9 objc_exception_throw + 56<br />
	2   CoreFoundation					  0x971733f8 +[NSException raise:format:arguments:] + 136<br />
	3   Foundation						  0x96f0c6e7 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 116<br />
	4   AppKit							  0x99ac3218 -[NSCell _objectValue:forString:errorDescription:] + 183<br />
	5   AppKit							  0x99ac3159 -[NSCell _objectValue:forString:] + 56<br />
	6   AppKit							  0x99ac30ae -[NSCell setStringValue:] + 56<br />
	7   AppKit							  0x99b89b64 -[NSControl setStringValue:] + 126<br />
	8   Message						0x0000278d -[V1AppDelegate awakeFromNib] + 301<br />
	9   CoreFoundation					  0x9710b984 -[NSSet makeObjectsPerformSelector:] + 196<br />
	10  AppKit							  0x99a9a1cc -[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:] + 1566<br />
	11  AppKit							  0x99a981a4 loadNib + 257<br />
	12  AppKit							  0x99a9759c +[NSBundle(NSNibLoading) _loadNibFile:nameTable:withZone:ownerBundle:] + 228<br />
	13  AppKit							  0x99a974ad +[NSBundle(NSNibLoading) loadNibFile:externalNameTable:withZone:] + 158<br />
	14  AppKit							  0x99a973f8 +[NSBundle(NSNibLoading) loadNibNamed:owner:] + 383<br />
	15  AppKit							  0x99a941fd NSApplicationMain + 434<br />
	16  Message						0x000025eb main + 43<br />
	17  Message						0x000025b5 start + 53<br />
)<br />


J'ai lu sur le net que l'erreur pouvait venir d'un non lien entre file's owner et la premier Xib.

J'ai donc modifier ceci (je n'ai pas encore testé).



Mais je ne pense pas que ce soit seulement la cause!

J'ai des images aussi inclut dans le projet, est que lors de la compilation l'application les embarque dans le .app?

Et dernière chose, je compile en x86 est-ce que cela peut jouer?



Merci..

Réponses

  • CéroceCéroce Membre, Modérateur
    mars 2012 modifié #2
    Le problème a plutôt l'air d'être que tu utilises une API qui existe sur 10.7 et pas 10.6.

    Sur le projet, il y a deux réglages:

    - Deployment target: il s'agit de la version d'OS minimum requise, là , tu as dû mettre 10.6

    - Base SDK: la version du SDK avec laquelle tu développes.



    Ce second paramètre est parfois source de confusion, mais en gros, si tu veux utiliser les dernières nouveautés de 10.7 (plein écran, NSPopoverController, cellules de NSTableViews personnalisées par des NSViews, etc.), il va falloir linker avec ce SDK. L'envers de la médaille est qu'il n'y a pas de vérification de compatibilité à  la compilation. Si tu linkes avec le SDK 10.6, tu ne peux plus profiter des dernières API, par contre le compilo se plaindra si tu utilises des API qui n'existent pas sous 10.6.



    Je serais donc tenté de dire que tu devrais passer sur le SDK 10.6 pour l'instant.



    P.S.: Je ne sais pas comment tu récupères ton appli, mais la bonne manière de faire est d'Archiver l'exécutable, qui est alors construit en mode "Release". Autrement, l'exécutable n'est compilé que pour l'architecture de la machine qui builde, et ça refusera de démarrer sur une autre archi.
  • cocoacola71cocoacola71 Membre
    mars 2012 modifié #3
    Merci de ta réponse.



    Pour ce qui est du SDK je l'ai donc mis en 10.6, aucune erreur de la part du compilateur image/smile.png' class='bbc_emoticon' alt=':)' />



    Par contre ma configuration utilise par défaut release (je n'y ai jamais touché), si je me trompe pas bien-sur.

    Cela ce trouve dans configuration du projet "Command-line builds use : release".



    Ce que je ne comprend pas comment archiver l'exécutable?

    Pour ma part j'affiche dans le finder mon application via un Click droit, m'affichant donc le dossier contenant mon .app
  • J'ai donc archiver l'appli mais le format n'est plus le même et ouvrable seulement avec xcode??
  • CéroceCéroce Membre, Modérateur
    D'après la pile d'appels, tu appellerais -[NSControl setStringValue:] en passant nil, ce qui n'est pas permis.

    Peut-être est-ce permis sous 10.7 et pas sous 10.6, sans avoir ton code, je n'en sais pas plus.
  • CéroceCéroce Membre, Modérateur
    'cocoacola71' a écrit:


    J'ai donc archiver l'appli mais le format n'est plus le même et ouvrable seulement avec xcode??


    Une fois que tu as archivé, clique le bouton Distribute (sous Xcode 4.3, il me semble qu'il s'appelait Share auparavant).



    Je ne vais pas entrer dans les détails, il y a d'autres moyens de compiler en mode Release (modifier les Schemes), mais c'est la manière simple. De toute façon, ce n'est probablement pas le problème, autrement tu ne pourrais même pas lancer l'appli.
  • mpergandmpergand Membre
    mars 2012 modifié #7
    L'erreur dit que dans /color][color=#000000]V1AppDelegate awakeFromNib[/color][color=#666600[color="#000000"], tu initialises un NSControl à  nil (NSTextfield ?), il faut mettre @";".[/color]

    [color="#000000"]Sous Lion ça ne plante pas, faire stringValue:nil, ne change pas la valeur du textField, avant Lion ça plante ![/color]



    [grillé par Céroce]
  • 'Céroce' a écrit:


    De toute façon, ce n'est probablement pas le problème, autrement tu ne pourrais même pas lancer l'appli.


    Bin en faite c'est ce qui se passe, l'appli ne se lance pas sous 10.6 j'ai tout de suite une fenêtre m'avertissant qu'il y a une erreur en me proposant de signaler, ignorer ou envoyer le contenu de l'erreur.

    Ce qui m'a permis de récupérer le contenu de l'erreur.



    Pour ce qui est de l'archivage parfait! à  tester image/smile.png' class='bbc_emoticon' alt=':)' />



    Merci!!
  • CéroceCéroce Membre, Modérateur
    Non, non, tu aurais un message qui te dit que tu ne peux pas lancer l'appli parce qu'elle n'est pas dans la bonne architecture. Je sais de quoi je parle parce que j'ai une appli qui doit marché du PowerPC G4 au Intel 64 bits.
  • Bonjour,



    J'affirme que l'archivage n'a pas changer mon problème puisque j'ai toujours le même.

    Sauf que je ne voit pas l'erreur.

    Dans ma première fenêtre, j'ai 3 NSTextFiedText, 1 NSSecureTextField, et 1 NSImage voilà  le chargement:
    -(void)awakeFromNib{<br />
        //textfield hidden<br />
        [id2 setHidden:YES];<br />
        [id2 setStringValue:@&quot;&quot;];<br />
        [id3 setHidden:YES];<br />
        [id3 setStringValue:@&quot;&quot;];<br />
        [id1 setStringValue:@&quot;&quot;];<br />
        [mdp1 setStringValue:@&quot;&quot;];<br />
     <br />
        // initialisation Identifiant.<br />
        NSString *initId1 =[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;id1&quot;]; <br />
        [id1 setStringValue : initId1];<br />
       <br />
        //initialisation Mot de Passe.<br />
        NSString *initMdp1 =[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;mdp1&quot;]; <br />
        [mdp1 setStringValue : initMdp1];<br />
       <br />
        //si autre compte user<br />
        NSString *initId2 =[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;id2&quot;]; <br />
        NSString *initId3 =[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;id3&quot;]; <br />
        if (&#33;[initId2 isEqualToString:@&quot;&quot;]) {<br />
    	    [id2 setHidden:NO];<br />
    	    [id2 setStringValue:initId2];<br />
    	    if ([initId1 isEqualToString:@&quot;&quot;]){<br />
    		    NSLog(@&quot;id1 = id2&quot;);<br />
    		    [id2 setHidden:YES];<br />
    		    [[NSUserDefaults standardUserDefaults] setObject:[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;id2&quot;] forKey:@&quot;id1&quot;];<br />
    		    [[NSUserDefaults standardUserDefaults] setObject:@&quot;&quot; forKey:@&quot;id2&quot;];<br />
    		    [id1 setStringValue : [[NSUserDefaults standardUserDefaults] stringForKey:@&quot;id1&quot;]];<br />
    		    [[NSUserDefaults standardUserDefaults] setObject:[[NSUserDefaults standardUserDefaults] stringForKey:@&quot;mdp2&quot;] forKey:@&quot;mdp1&quot;];<br />
    		    [[NSUserDefaults standardUserDefaults] setObject:@&quot;&quot; forKey:@&quot;mdp2&quot;];<br />
    		    [mdp1 setStringValue : [[NSUserDefaults standardUserDefaults] stringForKey:@&quot;mdp1&quot;]];<br />
    		    [[NSUserDefaults standardUserDefaults] synchronize];<br />
    	    }<br />
        }<br />
    




    Et j'ai une autre question concernant la mémoire, est-il mieux d'utiliser Garbage Collector ou la gérer manuellement??

    Car quand j'active le GC (required) j'ai des erreurs qui apparaà®ent..
  • mpergandmpergand Membre
    mars 2012 modifié #11




    si nitId1 est nil, ça plante (pareil pour mdp1, id2,id3, etc)



    Pour éviter de faire un test à  chaque fois, tu crées un dico de ces valeurs par défaut et tu l'enregistres avec la méthode "registerDefaults" avant tout accès aux préférences.
  • cocoacola71cocoacola71 Membre
    mars 2012 modifié #12
    Euh parles-tu de NSDictionnary? Ou autre chose?

    Je n'ai jamais toucher à  sa image/crazy.gif' class='bbc_emoticon' alt=' B) ' />

    Mais à  ce que je comprend cela utilise des objets ainsi que des clef!

    Je suis d'accord mais j'en fait quoi lol
  • Exemple perso:


    userDefaults=[NSUserDefaults standardUserDefaults];



    NSMutableDictionary* defaultValueDic=[NSMutableDictionary dictionary];



    [defaultValueDic setInt:1 forKey:WVPrefs_TextSize];

    [defaultValueDic setRect:NSMakeRect(10,10,600,450) forKey:WVPrefs_WindowFrame];

    [defaultValueDic setObject:@";" forKey:WVPrefs_DefaultPage];




    [sUserDefaults registerDefaults:defaultValueDic];
  • CéroceCéroce Membre, Modérateur
    'cocoacola71' a écrit:


    J'affirme que l'archivage n'a pas changer mon problème puisque j'ai toujours le même.


    Oui, c'est ce que je disais, si c'était le problème, tu ne pourrais même pas lancer l'appli.


    'cocoacola71' a écrit:


    Et j'ai une autre question concernant la mémoire, est-il mieux d'utiliser Garbage Collector ou la gérer manuellement??

    Car quand j'active le GC (required) j'ai des erreurs qui apparaà®ent..


    Pour faire court: gère manuellement. C'est finalement moins d'ennuis.

    Pour la réponse longue, fais une recherche.
  • DrakenDraken Membre
    mars 2012 modifié #15
    Céroce, peut-on utiliser ARC sous OSX ? Ou est-ce une spécialité iOS ?
  • CéroceCéroce Membre, Modérateur
    D'après Peupeul, ça fonctionne sous 10.6 et 10.7 pour les applis 64 bits (il doit falloir le Runtime Moderne, j'imagine).

    Pas de références weaks sous 10.6 (mêmes limitations que sous iOS 4).
  • Impeccable l'application se lance image/smile.png' class='bbc_emoticon' alt=':)' />
    NSMutableDictionary *defautValue = [NSMutableDictionary dictionary];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;id1&quot;];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;id2&quot;];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;id3&quot;];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;mdp1&quot;];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;initId1&quot;];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;initId2&quot;];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;initId3&quot;];<br />
        [defautValue setObject:@&quot;&quot; forKey:@&quot;initMdp1&quot;];<br />
        [[NSUserDefaults standardUserDefaults] registerDefaults:defautValue];<br />
    




    Merci à  vous
Connectez-vous ou Inscrivez-vous pour répondre.