Pierre Chatelier: De C++ à Objective-C

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.

Article lu   fois.

L'auteur

Site personnel

Liens sociaux

Viadeo Twitter Google Bookmarks ! Facebook Digg del.icio.us Yahoo MyWeb Blinklist Netvouz Reddit Simpy StumbleUpon Bookmarks Share on Google+ 

0. 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 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
  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 Pseudo-clonage, 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ées 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 druant 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

2. Téléchargement

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

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

  

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.