Pierre Chatelier: De C++ à Objective-C
Date de publication : 8 Juillet 2007 , Date de mise à jour : 1 Septembre 2007
Par
Pierre Chatelier (Pierre Chatelier)
Ce document est un guide de passage de C++ à Objective-C. Il existe plusieurs documentations
soucieuses d'enseigner le modèle objet via Objective-C, mais aucune à ma connaissance n'est destinée
aux codeurs expérimentés en C++, désirant se renseigner sur les concepts du langage pour les
comparer à ce qu'ils connaissent déjà. Le langage Objective-C m'avait semblé au premier abord un
obstacle plutôt qu'un tremplin à la programmation avec Cocoa (cf. section 1 page suivante) : il
est si peu répandu que je ne comprenais pas son intérêt face à un C++ puissant, efficace et maîtrisé.
Il a donc fallu longtemps pour que je comprenne qu'il était au contraire un réel concurrent grâce
à la richesse des concepts qu'il propose. Ce document ne se présente pas comme un didacticiel
mais comme une référence de ces concepts. Il permettra ainsi, je l'espère, d'éviter qu'une mauvaise
connaissance d'Objective-C conduise un développeur C++, soit à abandonner trop vite ce langage,
soit à utiliser à mauvais escient ses outils habituels, produisant alors un code bâtard, inélégant et
inefficace. Ce document ne se veut pas une référence complète, mais rapide. Pour une description
approfondie d'un concept, mieux vaut consulter une documentation Objective-C spécifique.
0. Historique
version 1.10
- adaption en anglais par Aaron Vegh ;
- réécriture de la section sur le clonage ;
- ajout d'une section sur le IMP caching ;
- précisions sur initialize ;
- précisions sur Objective-C++ ;
- correction des propos sur superclass ;
- précisions sur les données « static »de classe ;
- précisions sur les étiquettes des paramètres de méthodes ;
- correction de coquilles sur les constructeurs virtuels ;
- correction d'erreurs à propos de self et super ;
- précisions sur Objective-C 2.0 ;
- précisions sur les chaînes statiques ;
- corrections de petites coquilles diverses.
version 1.9
version 1.8
- précisions sur Objective-C 2.0 (ramasse-miettes, énumération rapide, properties) ;
- précisions sur l'envoi d'un message à nil ;
- précisions sur les cycles de retain ;
- précisions sur les mutateurs et accesseurs en lecture ;
- quelques reformulations et corrections typographiques.
version 1.7
- corrections de fautes de frappe ([release chaine] au lieu de [chaine release]).
version 1.6
- corrections de fautes de frappe.
version 1.5
- un grand merci à Jean-Daniel Dupas pour ses corrections !
- correction : (partie 5.2.3) en Objective-C, l'attribut par défaut n'est pas private mais protected ;
- correction : (partie 5.3.5) @selector() est évalué à la compilation et ne pénalise pas les performances ;
- correction : (partie 5.4.2) un retain est plus logique qu'un copy ;
- correction : (parties 6.4.2 et 6.6) on ne peut pas utiliser catégorie et super-classe en même temps ;
- correction : (partie 7.1.1) la donnée d'instance isa est initialisée dans alloc et non dans init ;
- précisions sur l'inlining dans la partie 12.2 ;
- les méthodes cString et initWithCString sont devenues obsolètes avec MacOS 10.4, il faut maintenant utiliser les équivalents UTF8 ;
- précisions sur self = [super init] dans la partie 7.1.3 ; les différents code d'exemple utilisant self = [super init] ; if (self){...} ; ont été corrigés en conséquence ;
- ajout de la partie 7.1.4 intitulée « Échec de l'initialisation » ;
- légère remise en page (séparation des sections par un saut de page).
version 1.4
- Précisions sur l'absence de NSList, NSQueue ;
- précisions sur les itérateurs ;
- corrections typographiques.
version 1.3
- Ajout d'une partie sur les arguments anonymes (ou muets) ;
- ajout d'une partie sur les données de classe ;
- ajout d'une partie sur les accesseurs en lecture ;
- légère modification du nom de la section traitant des mutateurs ;
- précision sur la possibilité de nommer une méthode comme une donnée d'instance ;
- ajout de « méthodes virtuelles pures » dans l'index.
version 1.2
- La partie sur les mutateurs était incorrecte ! Elle est maintenant conforme au Cocoa programming for MacOS X [4] ;
- modification de la section « Appel de méthodes » en « Différenciation entre fonctions et méthodes » ; contenu légèrement modifié également ;
- correction de quelques erreurs typographiques et de fautes d'orthographe.
version 1.1
- Ajout de la présente section ;
- les renvois du document sont maintenant des hyperliens pour naviguer plus rapidement ;
- meilleure gestion des accents dans les lecteurs PDF;
- explications plus complètes sur la copie (clonage) ;
- plus de détails sur les objets mutables ;
- référence au « Cocoa Programming for MacOS X » ;
- référence à SGI ;
- quelques petits remaniements de phrases.
1. Table des Matières
Table des matières
Introduction
1 Objective-C et Cocoa
2 Bref historique d'Objective-C
3 Généralités sur la syntaxe
3.1 Mots-clefs
3.2 Commentaires
3.3 Mélange code/déclarations
3.4 Nouveaux types et valeurs
3.4.1 BOOL, YES, NO
3.4.2 nil, Nil et id
3.4.3 SEL
3.5 Nom des classes : pourquoi NS ?
3.6 Différenciation entre fonctions et méthodes
4 Organisation du code source : fichiers .h, fichiers .m et inclusion
5 Classes et objets
5.1 Classe racine, type id, valeurs nil et Nil
5.2 Déclaration de classes
5.2.1 Attributs et méthodes
5.2.2 Déclarations forward : @class, @protocol
5.2.3 public, private, protected
5.2.4 Attributs static
5.3 Méthodes
5.3.1 Prototype et appel, méthodes d'instance, méthodes de classe
5.3.2 this, self et super
5.3.3 Accès aux données d'instance de son objet déclencheur
5.3.4 Identifiant et signature du prototype, surcharge
5.3.5 Pointeur de méthode : Sélecteur
5.3.6 Paramètres par défaut
5.3.7 Nombre d'arguments variable
5.3.8 Arguments muets
5.3.9 Modificateurs de prototype (const, static, virtual, « = 0 », friend, throw)
5.4 Messages et transmission
5.4.1 Envoi d'un message à nil
5.4.2 Délégation d'un message vers un objet inconnu
5.4.3 Forwarding : gestion d'un message inconnu
5.4.4 Downcasting
6 Héritage
6.1 Héritage simple
6.2 Héritage multiple
6.3 Virtualité
6.3.1 Méthodes virtuelles
6.3.2 Redéfinition silencieuse des méthodes virtuelles
6.3.3 Héritage virtuel
6.4 Protocoles
6.4.1 Protocole formel
6.4.2 Protocole informel
6.4.3 Qualificateurs pour messages entre objets distants
6.5 Catégories de classe
6.6 Utilisation conjointe de protocoles, catégories, dérivation
7 Instanciation
7.1 Constructeurs, initialisateurs
7.1.1 Distinction entre allocation et initialisation
7.1.2 Utilisation de alloc et init
7.1.3 Exemple d'initialisateur correct
7.1.4 Échec de l'initialisation
7.1.5 Constructeur par défaut : initialisateur désigné
7.1.6 Listes d'initialisation et valeur par défaut des données d'instance
7.1.7 Constructeur virtuel
7.1.8 Constructeur de classe
7.2 Destructeurs
7.3 Opérateurs de copie
7.3.1 Clonage classique, copy et copyWithZone
7.3.2 NSCopyObject()
7.3.3 Pseudo-clonage, mutabilité, mutableCopy et mutableCopyWithZone
8 Gestion mémoire
8.1 new et delete
8.2 Compteur de références
8.3 alloc, copy, mutableCopy, retain, release
8.4 autorelease
8.4.1 Indispensable autorelease
8.4.2 Bassin d'autorelease
8.4.3 Utilisation de plusieurs bassins d'autorelease
8.4.4 Prudence avec autorelease
8.4.5 autorelease et retain
8.4.6 Constructeurs de commodité, constructeur virtuel
8.4.7 Accesseurs en écriture : Mutateurs
8.4.8 Accesseurs en lecture
8.5 Cycles de retain
8.6 Ramasse-miettes
9 Exceptions
10 Chaînes de caractères en Objective-C
10.1 Seuls objets statiques possibles d'Objective-C
10.2 NSString et les encodages
10.3 Description d'un objet, extension de format %@, d'une NSString à une chaîne C
11 STL et Cocoa
11.1 Conteneurs
11.2 Itérateurs
11.2.1 Énumération classique
11.2.2 Énumération rapide
11.3 Foncteurs (objets-fonctions)
11.3.1 Utilisation du selector
11.3.2 IMP caching
11.4 Algorithmes
12 Fonctionnalités propres au C++
12.1 Références
12.2 Inlining
12.3 Templates
12.4 Surcharge d'opérateurs
12.5 Friends
12.6 Méthodes const
12.7 Liste d'initialisation dans le constructeur
13 RTTI (Run-Time Type Information)
13.1 class, superClass, isMemberOfClass, isKindOfClass
13.2 conformsToProtocol
13.3 respondsToSelector, instancesRespondToSelector
13.4 Typage fort ou typage faible via id
14 Objective-C++
15 Objective-C 2.0
Conclusion
Références
Révisions du document
Index
2. Téléchargement


Copyright © 2005, 2006, 2007 Pierre Chatelier. Aucune reproduction, même partielle, ne peut être faite
de ce site et de l'ensemble de son contenu : textes, documents, images, etc
sans l'autorisation expresse de l'auteur.
Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E
de dommages et intérêts.
Cette page est déposée à la
SACD.