Cocoa.fr

Developpement Mac, Objective-C, Cocoa et Swift

Migration cocoa.fr

Un blog Mac qui garde l'esprit historique, avec une base moderne.

Theme modernise a partir de la palette d'origine. Architecture prete pour importer les anciens contenus Objective-C, Cocoa et Swift.

09 December 2008 C

OpenCL 1.0 est disponible

La version 1.0 de la spécification de OpenCL est sorti le 5 décembre, elle définit :

  • un sous-ensemble du langage C99 avec des extentions pour gérer le parallélisme
  • une API pour gérer les données et les tâches entre plusieurs processeurs hétérogène.
  • une interopérabilité avec OpenGL, OpenGL ES et d’autres API graphiques

Pour aller plus loin et découvrir OpenCL, vous pouvez utilisez les liens suivants :

La grande interrogation est maintenant de savoir l’API que va proposer Apple pour gérer tout ça en Objective-C.

09 December 2008 Cocoa

La documentation indispensable

Ce site n’est pas l’endroit pour prodiguer un cours sur Cocoa. Non seulement, le sujet est trop étendu, mais aussi, la documentation existe déjà.

La doc d’Apple

Vous trouverez cette documentation sur le site developpeurs d’Apple, mais le plus pratique est de la consulter sous XCode via le menu Help > Documentation. Il s’agit d’une documentation de référence: elle contient beaucoup, en fait beaucoup trop d’informations; d’autant plus qu’on y trouve beaucoup de blabla. Il s’agit pourtant d’un outil quotidien, qui répondra à presque toutes vos questions, quand vous saurez où chercher.

Même si Apple a fait des efforts pour fournir quelques guides d’introduction, vous attaquer de front à la doc ne peut que vous impressionner, vous noyer et finalement vous dégoûter, ce qui nous amène à…

Cocoa Programming for Mac OS X

Couverture Cocoa Programming À sa sortie en 2002, ce livre fut accueilli avec un grand soulagement. Son auteur, Aaron Hillegass, était formateur pour NeXT avant de monter sa propre société de formation, et propose un livre simple d’accès, destiné à vous procurer le bagage minimum. À vrai dire, si vous posez des questions sur les forums, on s’attendra à ce que vous l’ayez lu, sinon on vous invitera souvent à le faire.

Les sujets couverts sont les suivants:

  • utilisation de base de XCode et d’Interface Builder
  • le langage Objective-C: syntaxe, gestion mémoire (y compris le ramasse-miettes), protocoles, catégories, propriété
  • Foundation
  • AppKit
  • Principes courants de Cocoa: délégués, archivage, notifications
  • Key-Value Coding, Bindings, Core Data
  • Core Animation

La grande force de ce livre, c’est son approche TP. Point de chichi: l’auteur vous montrera par exemple une fenêtre en écrivant “débrouillez vous pour que ça ressemble à ça”. Il s’agit d’un enseignement progressif: les objectifs sont fixés, quelques principes expliqués, puis vient le codage. En fin de chapitre, se trouve un encart “pour les plus curieux” où l’auteur fournit quelques informations sur le fonctionnement de Cocoa. Enfin, sont proposés des défis: il s’agit pour le lecteur de travailler tout seul cette fois-ci, et d’améliorer le programme. Et il est utile de le préciser: tous les défis sont faisables.

Il ne s’agit pas d’un livre de référence, on n’y découvre que quelques classes, mais ce sont des classes représentatives, et l’essentiel de chaque concept est expliqué pour pouvoir approfondir avec la doc d’Apple par la suite.

Couverture Programmation Cocoa Le livre a été mis à jour à la sortie de Mac OS 10.5. Cette troisième édition, traduite en français, vient tout juste de paraître, sous le titre Programmation Cocoa sous Mac OS X.

En résumé: conseillé sans réserve aucune, pourvu que vous ayez les pré-requis: connaître le langage C et avoir des notions de programmation orientée objet.

Objective-Cocoa.org

Il s’agit d’un forum en français qui existe depuis deux ans. L’ambiance y est détendue, les débutants bienvenus même si des usagers de Cocoa qui ont de la bouteille y participent.

Le guide du débogage

Il arrive un moment où le débogage à base de NSLog() montre ses limites. Si n’explique pas l’utilisation du débogueur, le guide suivant fournit quantités d’astuces: Technical Note TN2124.

La mailing-list d’Apple

Apple a mis en place des listes sur divers sujets. Celle qui nous intéresse est bien évidemment celle de Cocoa. À vrai dire, utiliser cette liste est à faire en dernier recours. En effet, pour poser une question, il est nécessaire de s’y abonner — normal, me direz-vous — sauf que vous allez recevoir de l’ordre de 100 messages par jour, la plupart n’ayant pas d’intérêt pour vous. Je vous conseillerais donc d’activer le mode “digest” dés le départ !

Reste qu’on y trouve des gens qui ont une connaissance poussée de Cocoa, et même parfois des ingés d’Apple. À ce propos, ces employés le font bénévolement, un hot-dog à la main, ou entre 20 et 22h. Cela dit, vous pouvez considérer que si vous n’obtenez pas la réponse sur cette liste, c’est que personne ne l’a.

Les sites spécialisés sur Cocoa

StepWise L’un des plus vieux sites. Contient beaucoup d’articles techniques et très intéressants.

Cocoa Dev Central Quelques articles d’introduction, et des liens.

07 December 2008 Objective-C

Objective-C et les tests unitaires

On me demandait dans les commentaires du billet précédent ce qu’était exactement les tests unitaires, je vais donc essayer d’expliquer à quoi ils servent et vous proposer quelques ressources pour aller plus loin.

Comme le nom l’indique, il s’agit de tester le comportement d’un unité d’un programme, c’est à dire par exemple une fonction ou une classe. Pour une fonction qui convertit une température de Celsius en Fahrenheit, on va tester que le résultat de la conversion pour différentes valeurs. On testera des valeurs négatives, positives, des lettres, etc. pour s’assurer que le résultat est correct et que les erreurs sont bien traités. Les tests permettent aussi d’éviter les régressions de votre programme, car lors d’une modification de votre code, vous pouvez exécuter les tests et vous assurez que le comportement n’a pas été altéré par vos modifications récents.

Vient ensuite le concept de couverture de code. Il s’agit de connaître le pourcentage des lignes de code du programme qui sont testés par votre jeu de tests unitaires. Par exemple, si votre fonction contient du code conditionnel avec l’instruction if/else, il faut que les différents tests de la fonction fassent intervenir à la fois le code dans le bloc if que dans le bloc else. Plus le pourcentage est élevé plus vous pouvez avoir confiance dans le comportement de votre code.

Pour allez plus loin, n’hésitez pas à lire les ressources suivantes :

J’espère avoir été assez clair, mais n’hésitez pas en cas de besoin à poser vos questions dans les commentaires.

05 December 2008 Cocoa

Visualiser la couverture de code de ses tests unitaires

Une des pratiques importantes dans le développement logiciel, est l’utilisation de tests unitaires. Cela permet de s’assurer du comportement de son code, d’éviter les régressions et de manière général d’avoir plus confiance en son code.

Google vous propose dans le cadre de son Google Mac Developer Playground un certain nombre d’outils pour développeur dont CoverStory, qui permet de visualiser facilement le taux de couverture de votre code à partir des fichiers générés par Gcov.

CoverStory

Pour plus d’informations sur CoverStory, les outils Google pour développeurs Mac et Gcov, utilisez les liens ci-dessous :

29 November 2008 Logiciel

Utiliser Git avec un projet XCode

Un des outils indispensable pour un développeur, est un gestionnaire de versions. Malheureusement XCode gère uniquement CVS, Perforce et Subversion. Si vous avez décidez d’aller voir du coté du gestionnaire distribué Git, voici un article de Christopher Roach sur son utilisation pour gérer un projet XCode :

Il est aussi possible de se servir uniquement de la liste des fichiers à ignorer pour l’adapter à Mercurial par exemple.

26 November 2008 Cocoa

Livre: Programmation Cocoa sous Mac OS X

Couverture On l’attendait avec impatience, la voici. La version française de la troisième édition de Cocoa Programming for Mac OS X vient de paraître.

L’éditeur a changé (ce n’est plus Eyrolles), et nous ne pouvons pas encore vous donner notre avis sur la traduction, mais la version anglaise reste le seul livre indispensable à tout programmeur Cocoa. À commander au père Noël d’urgence.

Note de Fabien: Je peux vous dire qu’il est vraiment sympa pour l’avoir lu dans le cadre de la relecture technique de la version française.

19 November 2008 Cocoa

Vos débuts en Cocoa

Comme promis, cet article sera plus concret que les précédents, je ne vais toutefois pas vous épargner la théorie puisque nous allons aborder un concept important pour Cocoa, le paradigme M-V-C, et voir quelques rudiments du langage Objective-C et de l’utilisation de nos deux outils, XCode et Interface Builder.

Le programme d’exemple

Afin d’être plus concrètes, les explications s’articuleront autour d’un programme simple, pas très éloigné de l’exemple classique d’Apple, à savoir, le convertisseur de monnaie. Cependant, je m’adresse ici à des programmeurs chevronnés qui voudront rapidement en venir aux faits.

Le principe de notre programme est le suivant: une fenêtre comprend deux champs éditables. Taper une température dans le champ Degrés Fahreinheit et valider fait apparaître la conversion dans le champ Degrés Celcius et vice-versa.

Le paradigme M-V-C

À l’instar d’autres bibliothèques de développement, Cocoa est basée sur le paradigme Modèle-Vue-Contrôleur, qui sépare les Vues (l’interface utilisateur) du Modèle (la partie qui conserve les données et effectue les calculs). Le Contrôleur fait les liens entre les deux couches.

MVC

Création du projet

XCode impose la création d’un projet pour regrouper les différents fichiers constituant l’application et définir ses paramètres de construction.

Sous XCode, sélectionnez le menu File > New Project… > Application > Cocoa Application. Cliquez sur Next, tapez un nom pour le projet, et choisissez sa localisation. La fenêtre du nouveau projet s’ouvre; il y a déjà quelques fichiers dans le projet.

Programme principal

Jetez un œil à main.m, dans la rubrique Other Sources:

    #import <Cocoa/Cocoa.h>

    int main(int argc, char *argv[])
    {
        return NSApplicationMain(argc,  (const char **) argv);
    }

Nous reconnaissons la forme canonique utilisée en C pour la fonction main(). Elle ne fait qu’appeler NSApplicationMain() qui va essentiellement créer une instance de la classe NSApplication.

La directive de compilation #import est similaire à #include, si ce n’est qu’un fichier déjà inclus ne le sera pas une seconde fois. On inclut ici cocoa.h qui se trouve dans le framework Cocoa.

Ressources

Dans la rubrique Resources , vous trouverez trois fichiers:

  • Info.plist Comme vous le voyez, il s’agit d’un fichier XML. Vous pouvez d’ailleurs éditer les fichiers .plist grâce à l’utilitaire Property List Editor, mais ce fichier-là peut être édité d’une façon plus conviviale (…c’est vite dit) dans XCode (menu Project > Edit Active Target).

  • InfoPlist.strings Les fichiers .strings servent à traduire une application dans une autre langue — ce qu’on dénomme souvent par le vilain anglicisme localiser. Les clefs y sont associées aux texte traduits. Ce fichier-ci est utilisé pour le texte s’affichant dans la boîte de dialogue À propos de…

  • MainMenu.nib Ce fichier contient des éléments d’interface utilisateur. Double-cliquez-le pour l’ouvrir dans Interface Builder… il y a déjà du monde à l’intérieur.

Couche Vue

Faîtes en sorte que la fenêtre Window ressemble à ceci:

Fenetre

Vous trouverez les éléments dans la palette Library (menu Tools > Library), dans la rubrique Cocoa > Views & Cells. Les champs éditables sont des Text Fields. Les intitulés sont des Label.

Couche Modèle

Nous allons ici créer la classe CFRConvertisseur. Pourquoi pas Convertisseur tout court ? Traditionnellement, les noms de classes commencent par un suffixe pour éviter des conflits (il n’existe qu’un namespace par application). Les classes de Cocoa commencent par NS pour… Next Step.

Sous XCode, dans la fenêtre du projet, sélectionnez la rubrique Classes. Sélectionnez le menu File > New File… > Cocoa > Objective-C Class. Cliquez sur Next, vous serez alors invités à saisir le nom. Tapez donc CFRConvertisseur.m. Puis cliquez sur Finish. Deux fichiers, CFRConvertisseur.m et CFRConvertisseur.h, sont alors insérés dans le projet. Ouvrez donc le .h :

    #import <Cocoa/Cocoa.h>

    @interface CFRConvertisseur : NSObject {

    }

    @end

C’est ainsi que l’on déclare une classe en Objective-C. NSObject est l’objet de base, dont héritent tous les objets, à de rares exceptions près.

On place entre les accolades les définitions des variables d’instances (variables membres). Notre programme n’en nécessitant pas, nous les laissons vides. Nous définissons, entre l’accolade } et @end, les méthodes. Comme nos méthodes n’accèdent pas aux variables d’instance, nous les déclarons comme des méthodes de classes (ce qu’on appellerait des méthodes “statiques” en Java), en les précédant du signe + .

    + (float) convertirCelciusEnFahrenheit:(float)celcius;
    + (float) convertirFahrenheitEnCelcius:(float)fahrenheit;

Pour info: les méthodes d’instances sont précédées du signe - .

Copiez ces deux lignes et ouvrez CFRConvertisseur.m.

Pour ouvrir le .m correspondant au .h courant, et vice-versa, cliquez sur la petite icône counterpart (en haut à droite) ou bien utilisez le menu View > Switch to Header / Source File.

Collez les prototypes des méthodes, afin d’implémenter les formules de conversion:

    #import "CFRConvertisseur.h"

    @implementation CFRConvertisseur

    + (float) convertirCelciusEnFahrenheit:(float)celcius
    {
        return (9.0/5.0) * celcius + 32.0;
    }

    + (float) convertirFahrenheitEnCelcius:(float)fahrenheit
    {
        return (5.0/9.0) * (fahrenheit - 32.0);
    }

    @end

Couche contrôleur

Et maintenant, nous programmons la couche contrôleur, qui fait le lien entre les vues et le modèle. Créez un nouveau fichier source, appelé CFRControleur.m.

Déclarations des outlets

Ouvrez CFRControleur.h. Tout d’abord, nous déclarons les outlets:

    @interface CFRControleur : NSObject {
        IBOutlet NSTextField*   champFahrenheit;
        IBOutlet NSTextField*   champCelcius;
    }

Les outlets sont des variables d’instance, quand notre classe CFRControlleur sera instanciée (à la lecture du fichier .nib), Cocoa fera pointer les variables sur les objets que nous leur auront lié. Nous allons voir ces liaisons dans un instant. Ecrire IBOutlet est nécessaire pour qu’Interface Builder sache qu’il s’agit d’outlets.

N’oubliez pas de rajouter #import “CFRConvertisseur.h”

Déclaration des actions

    @interface CFRControleur : NSObject {
        IBOutlet NSTextField*   champFahrenheit;
        IBOutlet NSTextField*   champCelcius;
    }

    - (IBAction) fahrenheitModifie:(id)sender;
    - (IBAction) celciusModifie:(id)sender;

    @end

Les actions sont des méthodes qui sont appelées lorsqu’un contrôle est actionné. Pour nos champs, cela signifie qu’on aura validé leur contenu en tapant sur Entrée. Une action a forcément un prototype de cette forme. id est le type générique des objets. Nous savons évidemment qu’il s’agit de NSTextFields.

Regardez donc à quoi correspond le symbole IBAction

Sous XCode, pour accéder à la définition d’un symbole, maintenez la touche Commande appuyée, et double-cliquez le symbole.

On peut voir qu’IBAction est équivalent à void et qu’IBOutlet équivaut à rien.

Liaison des Outlets et Actions

Retournez sous Interface Builder. Faîtes apparaître la palette Library (menu Tools > Library). Dans la rubrique Library > Cocoa > Objects & Controllers, vous trouverez un cube bleu, intitulé NSObject. Glissez-le dans la fenêtre MainMenu.nib. Ainsi, Cocoa instanciera un objet de la classe NSObject à l’ouverture du .nib… mais ce n’est pas ce que nous voulons ! Sélectionnez le cube, puis dans la palette Inspector > Object Identity mettez le champ Class à CFRControleur. Vous remarquerez que les actions et outlets sont apparues au bas.

Cliquez sur le cube bleu en maintenant la touche Contrôle appuyée (ou bien clic droit), et reliez le cube au champ Fahrenheit. Quand vous lâchez le bouton, un menu apparaît: choisissez champFahrenheit. Et voilà! L’outlet, champFahrenheit est liée au champ la représentant. Faîtes de même pour le champ Celcius.

Pour les actions, c’est pareil, mais en tirant un segment du champ vers le cube. Je vous laisse faire.

Implémentation des actions

Revenons à XCode et à CFRControleur.m, pour y ajouter les deux méthodes d’actions:

    - (IBAction) fahrenheitModifie:(id)sender
    {
        // Afficher la température convertie dans le champ Celcius
        float fahrenheit = [sender floatValue];
        float celcius = [CFRConvertisseur convertirFahrenheitEnCelcius:fahrenheit];
        [champCelcius setFloatValue:celcius];
    }

Remarquez le [sender floatValue]. Il s’agit d’un appel de méthode, qu’on appelle plus volontiers un message en ObjC. Nous savons que sender est notre NSTextField Fahrenheit. Nous lui demandons de nous envoyer sa valeur sous la forme d’un float.

[CFRConvertisseur convertirFahrenheitEnCelcius:fahrenheit] est également un message, mais comme convertirFahrenheitEnCelcius: est une méthode de classe, nous la faisons précéder du nom de sa classe.

Finalement, nous demandons au champ Celcius d’afficher la valeur celcius.

Ajoutons l’autre méthode:

    - (IBAction) celciusModifie:(id)sender
    {
        // Afficher la température convertie dans le champ Fahrenheit
        [champFahrenheit setFloatValue:[CFRConvertisseur convertirCelciusEnFahrenheit:[sender floatValue]]];
    }

Cette méthode est similaire à la précedente, si ce n’est que j’ai imbriqué les messages.

Terminez par ajouter

    #import "CFRConvertisseur.h"

Alors ça marche ?

Nous n’avons plus qu’à lancer le programme: menu Run > Run. Ça doit compiler et lancer l’application. Je vous laisse jouer et essayer quelques valeurs.

Quelques améliorations

Vous aurez peut-être remarqué que le programme souffre de deux défauts:

  • trop de chiffres sont affichés (c’est inesthétique)

  • si on entre des caractères plutôt que des chiffres, cela revient à taper zéro (c’est mal).

Retournez sous Interface Builder. Dans la palette Library > Library > Cocoa > Views & Cell, recherchez le Number Formater (un rectangle avec un $ ). Glissez-le sur le champ Fahrenheit. Allez dans la première rubrique de l’Inspecteur (Number Formater Attributes), et mettez-y le menu Style à Decimal. Faîtes de même pour le champ Celcius.

Retournez sous XCode, relancez l’application… les deux défauts sont réglés !

Pour finir

Cet article n’était qu’une introduction, mais vous a cependant présenté les concepts de bases de Cocoa: MVC, édition des .nib, Outlets et actions. Les prochains articles vous aideront à approfondir ces connaissances.

Le projet complet à télécharger, si vous n’avez pas réussi.