Gestalt ?

J'ai raté un épisode ! je ne trouve pas par quoi est remplacé Gestalt?


 


Donc, comment fait-on pour connaitre la version d'OSx ou s'exécute un programme?


Réponses

  • AliGatorAliGator Membre, Modérateur
    On utilise les APIs du SDK.

    Par exemple pour la version d'OSX où s'exécute le programme, y'a [[NSProcessInfo processInfo] operatingSystemVersion] (OSX 10.10 / iOS8) et tu as même une méthode de -[NSProcessInfo isOperatingSystemAtLeastVersion:].
  • Ok, Merci je vais voir ça, avec le bémol: ça doit marcher de 10.5 ..... à  maintenant!


  • tabliertablier Membre
    août 2014 modifié #4

    En fait, ce que je cherche c'est le numéro de version d'OSx.  Je n'ai pas OSx 10.10, donc je n'ai pas la méthode operatingSystemVersion. La seule possibilité sous 10.9 est d'utiliser operatingSystemVersionString ce qui donne un string et Apple précise:



    This string is human readable, localized, and is appropriate for displaying to the user. This string is not appropriate for parsing.



    Sur le web ce sujet donne lieu à  une chose bizarre: Tout le monde dit "Gestalt est deprecated depuis 10.8", mais tous les intervenants donnent comme solution:



    int main() {


     SInt32 versMaj, versMin, versBugFix;
     Gestalt(gestaltSystemVersionMajor, &versMaj);
     Gestalt(gestaltSystemVersionMinor, &versMin);
     Gestalt(gestaltSystemVersionBugFix, &versBugFix);

     printf("OS X Version: %d.%d.%d\n", versMaj, versMin, versBugFix);
    }

     


    Donc, je vais continuer d'utiliser Gestalt!


  • mpergandmpergand Membre
    août 2014 modifié #5

    Il existe les constantes NSAppKitVersionNumber et NSFoundationVersionNumber


     


    Determining the Version of the Operating System or a Framework


  • @mpergand


    Dans le texte indiqué, le conseil est:



    To check the version of OS X at run time, use the Gestalt function and the System Version Selectors constants.



     


    Encore une fois c'est un texte qui date de 4 ans et qui n'a pas été remis à  jour!


    Ce n'est pas facile de tenir à  jour les documentations et les exemples, mais quand même, je trouve qu'Apple ne fait plus l'effort nécessaire!


  • AliGatorAliGator Membre, Modérateur
    Gestalt est deprecated mais dans quelle version sera t il complètement retiré ?


    Car si on tu fais le code classique pour du dev cross-SDK (if ([NSProcessIngo instancesRespondsToSelector:@selector(operatingSystemVersion)]( blablabla) comme ça pas de soucis.
  • C'est ce que je fais d'habitude. Mais parfois ça me laisse songeur.


    exemple pour une appli avec Base SDK 10.9 et OSx Deployement target 10.5 j'ai écrit:



    if ([openPanel respondsToSelector:@selector(fileURLWithPath:isDirectory:)])


    { if (defoDir!=nil)  [openPanel setDirectoryURL:[NSURL fileURLWithPath:defoDir isDirectory:YES]] 


      if (defoFile!=nil) [openPanel setNameFieldStringValue:defoFile] ;


      btOk = [openPanel runModal] == defaultButton ;                                         // Ok ?


    }


    else


      btOk = [openPanel runModalForDirectory:defoDir file:defoFile] == defaultButton ; // avant 10.6



    Sous 10.9.4, Xcode 5.1.1. je mets des points d'arrêt sur les deux lignes "btOk =" et je lance l'application.


    Le debugger s'arrête sur la ligne du runModalForDirectory et non pas sur la ligne du runModal. Il me semble que c'est contraire à  ce que j'ai lu dans la doc (ou alors je me plante quelque part!).


     


    (nb defaultButton est décrit ailleurs).


     


  • AliGatorAliGator Membre, Modérateur
    Heu je connais pas bien les APIs OSX mais ton code n'est pas logique.


    Tu testes l'existence du sélecteur "fileURLWithPath:isDirectory:" sur... openPanel, alors que dans le if tu appelles cette méthode sur ... NSURL (ce qui me paraà®t plus cohérent).

    C'est pas openPanel qui est sensé répondre à  fileURLWithPath:isDirectory je pense...
  • Aaaaaaaahhhhhhh! comment n'ai-je pas vu ça!


     La Doc a encore frappé, merci je vais corriger.


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