Accueil Nos publications Blog Développer sur iOS : iOS Immersion

Développer sur iOS : iOS Immersion

ApplicationApple

Bienvenu dans le monde mobile de la pomme !

Seront présentés dans ce billet :

  • les prérequis au développement d’applications mobiles Apple ;
  • les outils permettant de vous faciliter la vie ;
  • les principes de la programmation iOS ;
  • des exemples simples de code illustrant ces principes.

Ce billet fait suite à la présentation “iOS Immersion” faite par Pascal Batty en décembre dernier. Pascal, si tu lis ceci, encore merci pour celle-ci ;o)

Pourquoi iOS ?

Ici, le but recherché est la réalisation d’une application mobile tactile sur iPhone, iPad, ou les deux !

L’une ou l’autre de ces cibles pouvant être privilégiée, car leur taille d’écran différente peut les destiner à des usages différents, à savoir qu’une application mobile supportée par les deux sera dite “universelle” (et aura l’avantage de ne devoir être téléchargée qu’une seule fois par l’utilisateur pour ses différents appareils sous iOS).

Quelle version d’iOS privilégier ?

Dernièrement, le ratio d’utilisation des versions d’iOS avoisinait :

  • 70% pour la 6.x
  • 25% pour la 5.x
  • 5% pour la 4.x

Un point important à prendre en compte est l’adoption rapide des nouvelles versions d’iOS sur le parc matériel. Aussi, lors du lancement d’une application, mieux vaut utiliser la dernière version en date. En effet :

  • elle devient sous peu le standard
  • cela permet de disposer des dernières nouveautés facilitant le développement d’applications

Outils

Mac

Aussi étrange que cela puisse paraître, pour coder sur iOS, le 1 er des outils à avoir est un ordinateur Apple ! Certains diront qu’il existe des alternatives permettant de le faire sur un “penguin” (“sphenisciforme” pour les francophones ; et non “pingouin” ;o) ), ou à travers une fenêtre, permettant donc d’éviter de croquer la pomme… C’est vrai… mais si possible, croquez quand même cette maudite pomme !

Les anciennes versions Mac avec un processeur PowerPC ne sont pas supportées. Il faudra donc un modèle nouvelle génération avec Mac OS 10.6.6, ou une version ultérieure, pour faire fonctionner Xcode 4.

Clavier QWERTY

Toujours côté matériel, optionnel mais tout aussi pratique : le clavier QWERTY ! Tout simplement parce que nombre des caractères spéciaux utilisés pour coder en iOS y sont bien plus accessibles, ce qui à la longue est grandement appréciable ;o)

iPhone et/ou iPad

Les tests sur simulateur ne sont pas suffisants, car son SDK ne fonctionne pas exactement comme celui des appareils. À l’utilisation, vous verrez que, très souvent, tout marche correctement sur le simulateur, mais dès lors que vous le compilez sur un appareil, quelques surprises désagréables peuvent arriver. Je vous conseille donc très fortement d’avoir à côté de vous le ou les appareil(s) concerné(s) par le développement de votre application. De plus, le simulateur ne permet pas de reproduire l’accéléromètre, le gyroscope, etc…

Xcode

Xcode est l’IDE (Integrated Development Environment) d’Apple. Xcode permet entre autres, de développer pour iPhone, iPad et iPod Touch. Il est disponible sur le web. Pour cela, créez un compte iTunes, ou utilisez celui que vous possédez déjà (cela simplifiera les démarches d’acquisition de licence par la suite). Vous trouverez la dernière version en téléchargement à l’adresse suivante : https://developer.apple.com/xcode/index.php .

Lors de la création de nouveaux projets, le choix d’un template vous offre une architecture de base ; vous pouvez choisir celui qui vous convient le mieux parmi les suivants :

  • Master-Detail Application : Ce projet contient une application ayant deux ViewController : un principal contenant une tableView qui contrôle le contenu d’un autre ViewController.
  • OpenGL Game Application : Vue OpenGL déjà configurée, avec un carré rempli d’un dégradé tournant sur lui-même.
  • Page-Based  Application : Template avec un titre de page, contenant une table des matières et des pages de contenu (qui sont formatées différemment).
  • Tabbed Application : Une Tab Bar (ou barre d’onglets) est une barre située en bas de l’écran vous permettant de choisir parmi plusieurs vues d’un simple clic. L’application iPod, par exemple, en compte une. Une Tab Bar est gérée par un UITabBarController.
  • Utility Application : Template servant à faire des applications “à 2 facettes”, telle l’application de météo ou de bourse, permettant de faire des transitions entre vos vues.
  • Single-View Application : En commençant par ouvrir un projet de ce type, vous aurez une vue qui s’affichera par-dessus la fenêtre (UIWindow). Cette vue sera gérée par un ViewController (UIView-Controller) chargé depuis un fichier .xib (fichier utilisé avec Interface Builder).
  • Empty Application : Projet de base, complètement épuré. Très souvent un bon point de départ pour comprendre ce que l’on fait !

Apple Developer Program

Un jour ou l’autre, vous serez obligé d’acheter la licence. Cela vous donnera un accès complet à la documentation, aux vidéos des conférences de la WWDC, et aux forums développeurs Apple (en anglais). Vous aurez également accès aux version bêta des frameworks. De plus, c’est le seul moyen pour tester votre application sur votre appareil, et la distribuer sur l’App Store.

Objective-C

L’Objective-C est un langage de programmation compilé, multi-plateforme, libre et orienté objet (il est né en 1983). Il avait pour but de tirer le meilleur parti de deux mondes représentés par les langages C et Smalltalk.

Les points importants à retenir sur l’Objective-C sont :

  • orienté objet : il intègre presque toutes les notions de POO existantes ;
  • réflexif : il a une capacité à se modifier à l’exécution ;
  • extension du C : il se construit autour des mécanismes du C et hérite de sa syntaxe (utilisation de pointeurs et autres) ;
  • communication par messages : principe tiré de Smalltalk ;
  • typage dynamique et faible : le type d’une variable est défini à l’exécution, et peut changer en cours de route ;
  • chargement dynamique : il s’exécute dans un runtime : une machine virtuelle se charge de distribuer les messages, de créer les objets et les classes, d’évaluer le type des variables, etc…

A noter que le premier système d’exploitation à utiliser Objective-C fut NeXTStep, de la société NeXT, fondée par… Steve Jobs.

Cocoa

Cocoa est une API native d’Apple pour le développement orienté objet. Les applications Cocoa sont typiquement construites en utilisant les outils de développement fournis par Apple, Xcode (anciennement Project Builder) et Interface Builder (utilisant le langage de programmation Objective-C).

L’architecture de Cocoa est une application stricte des principes MVC. Dans Mac OS X 10.4, Apple introduisit la famille de classe NSController, fournissant des comportements prédéfinis à la couche contrôleur.

Une des fonctionnalités importantes de l’environnement Cocoa est sa facilité à gérer la mémoire allouée dynamiquement : la classe NSObject de Cocoa, d’où la plupart des classes sont dérivées, implémente un compteur de références pour la gestion de la mémoire.

Cocoa fournit une technique de manipulation de données omniprésente appelée Key-Value Coding (KVC). Elle permet, pour une portion de données ou une propriété d’un objet, d’être recherchée ou changée pendant l’exécution grâce à son nom.

Immersion dans le code

Nil est un objet équivalent au pointeur NULL dans pleins d’autres langages, à la différence près que l’on peut appeler des méthodes sur Nil sans crash de l’application, ni déclenchement d’exceptions.

NSObject est la classe parente de tout objet en Objective-C. A noter que, n’ayant pas de namespace, on préfixe les classes créées par 2 ou 3 lettres, par convention.

Héritant de NSObject, on dispose de toute une boîte à outils d’objets immutables tels que :

  • NSString
  • NSArray
  • NSDictionary
  • NSSet

ayant aussi leur version mutable :

  • NSMutableString

Déclaration

Chaque classe est composée d’un fichier de déclaration (comme en C) la décrivant.
La déclaration d’une méthode se fait ainsi :

  • on décide si c’est une méthode de classe ou non (+ ou -) ;
  • on définit son type (id, int, NSArray *, etc…) et son sélecteur (son nom) ;
  • au besoin, on définit un paramètre en rajoutant “:”, le type et le nom du paramètre.

Exemple de création d’une classe Person dérivant de NSObject :

#import <Foundation/Foundation.h> 
@interface Person:NSObject 
@property NSString *name; 
- (id)init; 
- (id)initWithName:(NSSString*)name;
+ (id)personWithName:(NSString *)name; 
@end

Note 1 : la déclaration des types du paramètre se fait entre parenthèses et à l’aide d’un pointeur.

Note 2 : id est un pointeur vers n’importe quel type d’objet. La puissance de l’Objective-C vient de sa dynamique, et id en est un exemple. Vous pourriez tout coder avec ce type !

Implémentation

Chaque classe comprend aussi un fichier d’implémentation , reprenant les mêmes signatures que dans le fichier de déclaration, mais avec le code interne en plus :

#import "Person.h" 
@implementation Person 
@synthesize name = _name; 
- (id)init { … } 
- (id)initWithName:(NSString *)name { … } 
+ (id)personWithName:(NSString *)name { … } 
@end

Message

En Objective-C, tout appel de méthode d’une classe est un passage de message. Pour appeler un message sur un objet, on place entre crochets l’objet puis le message. Ainsi on peut chaîner les appels très facilement.

La syntaxe d’un message est un peu particulière. Ce qu’il y a entre crochets est le contenu du message, séparé en deux parties :

  • à gauche, le receveur est l’objet qui va recevoir le message et exécuter la méthode appelée ;
  • à droite, c’est la méthode elle-même avec ses paramètres, si besoin.
[teller sayHello]; 
// son équivalent Java/C# serait : teller.sayHello();
[teller sayHelloTo:person]; 
// son équivalent Java/C# serait : teller.sayHello(person);

A noter qu’il n’y a pas de surcharge de méthode : si on veut une même méthode avec un nombre différent de paramètres, on fait plusieurs méthodes !

[teller say:message to:person andTo:person2];

Initialisation, Accesseurs

La création d’un nouvel objet revient à faire :

  • une allocation mémoire sur sa classe
  • une initialisation sur une instance de classe

Exemple avec la création de trois objets Person :

Person *person1 = [[Person alloc] init]; 
Person *person2 = [[Person alloc] initWithName:@"Noé"]; 
Person *person3 = [Person personWithName:@"Jim"];

Il existe différentes manières de setter/affecter une valeur aux membres d’une classe :

// utilisation des crochets 
[person1 setName:@"Jen"]; 
// syntaxe avec points 
person2.name = @"Pam";

De même que pour les getter/récupérer :

NSString *name = [person1 name]; 
NSString *otherName = person2.name;

Mémoire

Objective-C utilise un système très simple pour gérer la mémoire : chaque objet possède un compteur, le retain count , qui va compter le nombre d’objets qui ont besoin de lui. Quand trois objets différents nécessitent l’objet en question, le retain count est de 3.

La méthode alloc alloue de la mémoire pour l’objet demandé.
La méthode retain augmente le retain count de 1 sur l’objet.
La méthode release , contrairement à ce qu’on pourrait penser, ne libère pas la mémoire allouée par + alloc ; elle ne fait que baisser le retain count de 1.
Lorsque le retain count atteint zéro, la méthode d’instance dealloc entre en scène et libère la mémoire.

Exemple d’une méthode de Person qui lui attribuerait un binôme :

- (void) setBinome:(Person *)newPerson { 
   // on vérifie que c'est bien une Person différente 
   if (_binome != newPerson) {
      // on ajoute une référence sur newPerson 
      [newPerson retain]; 
      // on libère une référence sur l'ancienne Person pointée 
      [_binome release]; 
      // on affecte newPerson à la propriété 
      _binome = newPerson; 
   }
}

Mais bonne nouvelle, toute cette gestion a été simplifiée avec l’arrivée de l’ Automatic Reference Counting (ARC) !!!

That’s all folks

Et voilà, vous n’avez plus qu’à vous lancer et laisser parler votre génie, votre inspiration et votre curiosité !

Bonne chance ;o)

Ressources