Pierre Chatelier: De C++ à Objective-C

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.

- Titre : Pierre Chatelier: De C++ à Objective-C

- Auteur : Pierre Chatelier

- Parution : 8 juillet 2007

- Mise à jour : 21 avril 2020

- Licence : Copyright ® 2010 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'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Historique

- II. Table des Matières

- III. Téléchargement

I - Historique

version 2.1

- ajouts d'explications pour les blocks.

version 2.0

- mise à jour pour Objective-C 2.0;

- nombreuses retouches.

version 1.11

- corrections de coquilles.

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

- changements mineurs.

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 codes 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.

II - Table des Matières

Table des matières
Introduction
1 Objective-C
1.1 Objective-C et Cocoa
1.2 Bref historique d'Objective-C
1.3 Objective-C 2.0
2 Généralité sur la syntaxe
2.1 Mots-clefs
2.2 Commentaires
2.3 Mélange code/déclarations
2.4 Nouveaux types et valeurs
2.4.1 BOOL, YES, NO
2.4.2 nil, Nil et id
2.4.3 SEL
2.4.4 @encode
2.5 Organisation du code source : fichiers .h, fichiers .m et inclusion
2.6 Nom des classes : pourquoi NS ?
2.7 Différenciation entre fonctions et méthodes
3 Classes et objets
3.1 Classe racine, type id, valeurs nil et Nil
3.2 Déclaration de classes
3.2.1 Attributs et méthodes
3.2.2 Déclarations forward : @class, @protocol
3.2.3 public, private, protected
3.2.4 Attributs static
3.3 Méthodes
3.3.1 Prototype et appel, méthodes d'instance, méthodes de classe
3.3.2 this, self et super
3.3.3 Accès aux données d'instance de son objet déclencheur
3.3.4 Identifiant et signature du prototype, surcharge
3.3.5 Pointeur de méthode : Sélecteur
3.3.6 Paramètres par défaut
3.3.7 Nombre d'arguments variable
3.3.8 Arguments muets
3.3.9 Modificateurs de prototype (const, static, virtual, « = 0 », friend, throw)
3.4 Messages et transmission
3.4.1 Envoi d'un message à nil
3.4.2 Délégation d'un message vers un objet inconnu
3.4.3 Forwarding : gestion d'un message inconnu
3.4.4 Downcasting
4 Héritage
4.1 Héritage simple
4.2 Héritage multiple
4.3 Virtualité
4.3.1 Méthodes virtuelles
4.3.2 Redéfinition silencieuse des méthodes virtuelles
4.3.3 Héritage virtuel
4.4 Protocoles
4.4.1 Protocole formel
4.4.2 Méthodes optionnelles
4.4.3 Protocole informel
4.4.4 Objet de type Protocol
4.4.3 Qualificateurs pour messages entre objets distants
4.5 Catégories de classe
4.6 Utilisation conjointe de protocoles, catégories, dérivation
5 Instanciation
5.1 Constructeurs, initialisateurs
5.1.1 Distinction entre allocation et initialisation
5.1.2 Utilisation de alloc et init
5.1.3 Exemple d'initialisateur correct
5.1.4 self = [super init…]
5.1.5 Échec de l'initialisation
5.1.6 Construction « éclatée » en alloc+init
5.1.7 Constructeur par défaut : initialisateur désigné
5.1.8 Listes d'initialisation et valeur par défaut des données d'instance
5.1.9 Constructeur virtuel
5.1.10 Constructeur de classe
5.2 Destructeurs
5.3 Opérateurs de copie
5.3.1 Clonage classique, copy, copyWithZone:, NSCopyObject()
5.3.2 NSCopyObject()
5.3.3 Pseudoclonage, mutabilité, mutableCopy et mutableCopyWithZone:
6 Gestion mémoire
6.1 new et delete
6.2 Compteur de références
6.3 alloc, copy, mutableCopy, retain, release
6.4 autorelease
6.4.1 Indispensable autorelease
6.4.2 Bassin d'autorelease
6.4.3 Utilisation de plusieurs bassins d'autorelease
6.4.4 Prudence avec autorelease
6.4.5 autorelease et retain
6.4.6 Constructeurs de commodité, constructeur virtuel
6.4.7 Accesseurs en écriture (Mutateurs)
6.4.8 Accesseurs en lecture
6.5 Cycles de retain
6.6 Ramasse-miettes
6.6.1 finalize
6.6.2 weak, strong
6.6.3 NSMakeCollectable()
6.6.4 AutoZone
7 Exceptions
8 Multithreading
8.1 Thread-safety
8.2 @synchronized
9 Chaînes de caractères en Objective-C
9.1 Seuls objets statiques possibles d'Objective-C
9.2 NSString et les encodages
9.3 Description d'un objet, extension de format %@, d'une NSString à une chaîne C
10 Fonctionnalités propres au C++
10.1 Références
10.2 Inlining
10.3 Templates
10.4 Surcharge d'opérateurs
10.5 Friends
10.6 Méthodes const
10.7 Liste d'initialisation dans le constructeur
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 Code implicite
12.1 key-value coding
12.1.1 Principe
12.1.2 Interception
12.1.3 Prototypes
12.1.4 Fonctionnalités avancées
12.2 Propriétés
12.2.1 Utilité des propriétés
12.2.2 Description des propriétés
12.2.3 Attributs des propriétés
12.2.4 Implémentation personnalisée des propriétés
12.2.5 Syntaxe des accès aux propriétés
12.2.6 Détails avancés
13 Dynamisme
13.1 RTTI (Run-Time Type Information)
13.1.1 class, superClass, isMemberOfClass, isKindOfClass
13.1.2 conformsToProtocol
13.1.3 respondsToSelector, instancesRespondToSelector
13.1.4 Typage fort ou typage faible via id
13.2 Manipulation des classes Objective-C durant l'exécution
14 Objective-C++
15 Évolutions d'Objective-C
15.1 Les blocks
15.1.1 Support et utilisation
15.1.2 Syntaxe
15.1.3 Capture de l'environnement
15.1.4 Variables __block
Conclusion
Références
Révisions du document
Index

III - Téléchargement

Télécharger le tutoriel De C++ à Objective-C au format PDF (880Ko) (miroir HTTP)

Pour lire les documents au format PDF, vous pouvez utiliser le logiciel Adobe Acrobat Reader.