Objective-C pour le développeur avancé
Transcription
Objective-C pour le développeur avancé
Avec le succès de l’iPhone et de l’iPad, la maîtrise d’Objective-C, langage natif des systèmes Apple Mac OS X et iPhone/iPad, devient un passage obligé pour les professionnels de la programmation – alors même qu’il ne fait pas partie de la formation classique des développeurs. Adressé au développeur qui connaît déjà d’autres langages objet, cet ouvrage éclaire toutes les subtilités d’Objective-C en le comparant avec les principaux langages que sont C++, Java, C# : syntaxe et concepts objet (classes, héritage, instanciation), gestion de la mémoire, chaînes de caractères, exceptions, multithreading, concept des propriétés, mécanismes de modifications à l’exécution… sans oublier les nouveautés d’Objective-C 2.0. Au sommaire De C#, Java, C++/QT à Objective-C • Du C au modèle objet • Objective-C et ses API (Cocoa…) • Racines non Unix • Bibliothèque runtime • Compilation et linkage • 32/64 bits • Syntaxe • Vrais et faux mots-clefs • Syntaxe du C sousjacent • Commentaires • Code/déclarations • Boucle for • Nouveaux types et valeurs • Organisation du code : fichiers .h, fichiers .m et inclusion • Fonctions et méthodes : une similarité trompeuse • Classes et objets • Classe racine, type id, valeurs nil et Nil • Déclaration • Attributs et méthodes • Déclarations anticipées (forward) : @class, @protocol • Visibilité public, protected, private • Messages et fonctions • Prototype et appel, méthodes d’instance, méthodes de classe • Cibles self et super • Identifiant et signature • Surcharge • Callbacks • Modificateurs de prototype • Messages et transmission • Délégation de message • Forwarding • Manipulations au runtime • Formes d’héritage • Héritage simple et multiple • Downcasting • Méthodes virtuelles • Redéfinition et surcharge • Méthodes virtuelles pures • Extension de classe (sans héritage) : les catégories • Classes abstraites • Protocoles formels et informels • Design-pattern Class-cluster • Instanciation, destruction et copie • Variable objet et pointeur d’objets • Forme de Coplien • Constructeurs, initialisateurs • alloc et init • self = [super init…] • Listes d’initialisation • Constructeur virtuel • Constructeur de classe • Destructeurs • Clonage classique et pseudo-clonage • Comparaison d’objets • == et operator<() en C++ • Hash • Gestion de la mémoire et ramasse-miettes • new et delete • Compteur de références (retain, release) • Autorelease et bassin d’autorelease • Garbage collector • Finalize • Liens faibles et forts • Singleton • Chaînes de caractères • NSString • Encodages • Chaîne C • Extension de format %@ • Description d’objet • Expressions régulières • Exceptions • @try, @throw, @catch • @finally • Filtres d’exception • Bassin d’autorelease local • Exceptions C++ • Spécificités 64 bits • Multithreading • @synchronized • Volatile • Utilitaires Cocoa et système • API de répartition de charge • Boucle événementielle • Code implicite et propriétés • Key-value coding • Interception • Accès aux propriétés • Différence entre « -> » et « . » • Dynamisme et runtime • RTTI du C++ • Introspection • Typage fort ou faible • Méthode et fonction d’implémentation • Chargement au runtime • Enrichissement conditionnel • Swizzling • Binaire Objective-C et outils de consultation • La STL et Cocoa • Conteneurs • Gestion mémoire • Itérateurs • Énumération rapide • Foncteurs (objets-fonctions) • Mise en cache d’un appel de méthode • Fonctions de rappels (callbacks) par blocs • Évolutions d’Objective C • Migration vers le 64 bits • Objective-C 2.0 • Objective C++ • Blocks • Closure (fermeture) • Annexes • Fonctionnalités propres au C++ • Références • Inlining • Templates • Surcharge d’opérateurs • Friends • Méthodes const • Namespace (espaces de noms) • C++/Objective-C. À qui s’adresse cet ouvrage ? – Développeurs expérimentés C++, Java, C#, Python et PHP 5 qui veulent développer pour iPhone ou Mac OS X – Professionnels du développement web et mobile – Fans d’iPhone qui souhaitent développer pour iPhone et Mac OS X 32 € P. Y. Chatelier Conception : Nord Compo Objective-C, langage objet indispensable pour développer en natif sous Mac OS X et pour l’iPhone et l’iPad Pierre Y. Chatelier développe pour Mac OS X par passion depuis qu’il a découvert cette plate-forme en 2002, et est maintenant l’auteur de plusieurs logiciels pour Mac OS et iPhone. Après avoir fait ses classes d’ingénieur à l’Isima de Clermont-Ferrand et obtenu un doctorat, il occupe maintenant un poste en recherche & développement en Bourgogne et souhaite promouvoir le langage Objective-C, peu enseigné malgré ses nombreuses qualités. 9 7 8221 2 1 27 5 1 5 Face à un C++ puissant, efficace et maîtrisé, Objective-C surprend par sa richesse et sa souplesse. Adressé au développeur confirmé, ce livre dense et érudit guidera les amoureux de la programmation iPhone/iPad et Mac OS X à travers toutes les subtilités de ce langage. P. Y. Chatelier Code éditeur : G12751 ISBN : 978-2-212-12751-5 pour le développeur avancé Objective-C pour le développeur avancé Le langage iPhone/iPad et Mac OS X pour les développeurs C++/Java/C# Objective-C Objective-C P i e r r e Y. C h a t e l i e r Face à un C++ puissant, efficace et maîtrisé, Objective-C surprend par sa richesse et sa souplesse. Adressé au développeur confirmé, ce livre dense et érudit guidera les amoureux de la programmation iPhone/iPad et Mac OS X à travers toutes les subtilités de ce langage. Objective-C, langage objet indispensable pour développer en natif sous Mac OS X et pour l’iPhone et l’iPad Avec le succès de l’iPhone et de l’iPad, la maîtrise d’Objective-C, langage natif des systèmes Apple Mac OS X et iPhone/iPad, devient un passage obligé pour les professionnels de la programmation – alors même qu’il ne fait pas partie de la formation classique des développeurs. Adressé au développeur qui connaît déjà d’autres langages objet, cet ouvrage éclaire toutes les subtilités d’Objective-C en le comparant avec les principaux langages que sont C++, Java, C# : syntaxe et concepts objet (classes, héritage, instanciation), gestion de la mémoire, chaînes de caractères, exceptions, multithreading, concept des propriétés, mécanismes de modifications à l’exécution… sans oublier les nouveautés d’Objective-C 2.0. Au sommaire De C#, Java, C++/QT à Objective-C • Du C au modèle objet • Objective-C et ses API (Cocoa…) • Racines non Unix • Bibliothèque runtime • Compilation et linkage • 32/64 bits • Syntaxe • Vrais et faux mots-clefs • Syntaxe du C sousjacent • Commentaires • Code/déclarations • Boucle for • Nouveaux types et valeurs • Organisation du code : fichiers .h, fichiers .m et inclusion • Fonctions et méthodes : une similarité trompeuse • Classes et objets • Classe racine, type id, valeurs nil et Nil • Déclaration • Attributs et méthodes • Déclarations anticipées (forward) : @class, @protocol • Visibilité public, protected, private • Messages et fonctions • Prototype et appel, méthodes d’instance, méthodes de classe • Cibles self et super • Identifiant et signature • Surcharge • Callbacks • Modificateurs de prototype • Messages et transmission • Délégation de message • Forwarding • Manipulations au runtime • Formes d’héritage • Héritage simple et multiple • Downcasting • Méthodes virtuelles • Redéfinition et surcharge • Méthodes virtuelles pures • Extension de classe (sans héritage) : les catégories • Classes abstraites • Protocoles formels et informels • Design-pattern Class-cluster • Instanciation, destruction et copie • Variable objet et pointeur d’objets • Forme de Coplien • Constructeurs, initialisateurs • alloc et init • self = [super init…] • Listes d’initialisation • Constructeur virtuel • Constructeur de classe • Destructeurs • Clonage classique et pseudo-clonage • Comparaison d’objets • == et operator<() en C++ • Hash • Gestion de la mémoire et ramasse-miettes • new et delete • Compteur de références (retain, release) • Autorelease et bassin d’autorelease • Garbage collector • Finalize • Liens faibles et forts • Singleton • Chaînes de caractères • NSString • Encodages • Chaîne C • Extension de format %@ • Description d’objet • Expressions régulières • Exceptions • @try, @throw, @catch • @finally • Filtres d’exception • Bassin d’autorelease local • Exceptions C++ • Spécificités 64 bits • Multithreading • @synchronized • Volatile • Utilitaires Cocoa et système • API de répartition de charge • Boucle événementielle • Code implicite et propriétés • Key-value coding • Interception • Accès aux propriétés • Différence entre « -> » et « . » • Dynamisme et runtime • RTTI du C++ • Introspection • Typage fort ou faible • Méthode et fonction d’implémentation • Chargement au runtime • Enrichissement conditionnel • Swizzling • Binaire Objective-C et outils de consultation • La STL et Cocoa • Conteneurs • Gestion mémoire • Itérateurs • Énumération rapide • Foncteurs (objets-fonctions) • Mise en cache d’un appel de méthode • Fonctions de rappels (callbacks) par blocs • Évolutions d’Objective C • Migration vers le 64 bits • Objective-C 2.0 • Objective C++ • Blocks • Closure (fermeture) • Annexes • Fonctionnalités propres au C++ • Références • Inlining • Templates • Surcharge d’opérateurs • Friends • Méthodes const • Namespace (espaces de noms) • C++/Objective-C. À qui s’adresse cet ouvrage ? – Développeurs expérimentés C++, Java, C#, Python et PHP 5 qui veulent développer pour iPhone ou Mac OS X – Professionnels du développement web et mobile – Fans d’iPhone qui souhaitent développer pour iPhone et Mac OS X P. Y. Chatelier P. Y. Chatelier Pierre Y. Chatelier développe pour Mac OS X par passion depuis qu’il a découvert cette plate-forme en 2002, et est maintenant l’auteur de plusieurs logiciels pour Mac OS et iPhone. Après avoir fait ses classes d’ingénieur à l’Isima de Clermont-Ferrand et obtenu un doctorat, il occupe maintenant un poste en recherche & développement en Bourgogne et souhaite promouvoir le langage Objective-C, peu enseigné malgré ses nombreuses qualités. Conception : Nord Compo pour le développeur avancé Objective-C pour le développeur avancé Le langage iPhone/iPad et Mac OS X pour les développeurs C++/Java/C# Objective-C Objective-C P i e r r e Y. C h a t e l i e r J. Gabès Nagios 3 pour la supervision Objective-C pour le développeur avancé Le langage iPhone/iPad et Mac OS X pour les développeurs C++/Java/C# Pier r e Y. Chatelier CHEZ LE MÊME ÉDITEUR XHTML/CSS, JavaScript pour le développement mobile. Des sites efficaces pour iPhone, Android avec et XUI/iUI. E. Sarrion. N°12775, 2010, 290 pages. Programmation Android. D. Guignard, E. Robles, N. Sorel, J. Chable. N°12587, 2010, 506 p. Mon GPS en action. P. Corréia. N°12668, 2010, 300 pages. Mac OS X Snow Leopard efficace. G. Gete. N°12586, 2010, 370 pages Audit et optimisation MySQL 5. P. Borghino, O. Dasini, A. Gadal. N°12634, 2010, 282 pages Programmation GWT 2. Développer des applications RIA et Ajax avec le Google Web Toolkit. S. Jaber. N°12569, 2010, 484 pages Asterisk. Études de cas. (coll. Cahiers de l’Admin). P. Sultan, dirigé par N. Makarévitch. N°12434, 2010, 298 pages. Richard Stallman et la révolution du logiciel libre. Une biographie autorisée. R. M. Stallman, S.Williams, C. Masutti (Framasoft). N°12609, 2010, 344 pages. Lisibilité des sites web. Des choix typographiques au design d’information. M.-V. Blond, O. Marcellin, M. Zerbib. N°12426, 2009, 326 pages. Réussir son site web avec XHTML et CSS. M. Nebra. N°12485, 3e édition, 2010, 318 pages. Ergonomie web. Pour des sites web efficaces. A. Boucher. N°12479, 2e édition, 2009, 458 pages. Bien rédiger pour le Web… et améliorer son référencement naturel. I. Canivet. N°12433, 2009, 412 pages. Conversion web. Améliorer ses taux de conversion web. S. Roukine. préface de P. Mosciusko-Morizet. N°12499, 2009, 270 pages. La programmation orientée objet. Cours et exercices en UML 2 avec Java 5, C# 2, C++, Python et PHP 5. H. Bersini, I. Wellesz. – N°12441, 4e édition, 2009, 602 pages (collection Noire). Gestion de projet. Vers les méthodes agiles. V. Messager Rota. – N°12518, 2e édition 2009, 272 pages (collection Architecte logiciel). Gestion de projet eXtreme Programming. J.-L. Bénard, L. Bossavit , R. Médina , D. Williams. – N°11561, 2002, 300 pages (collection Architecte logiciel). Programmation Python. Conception et implémentation. T. Ziadé. – N°12483, 2e édition 2009, 586 pages. Best practices PHP 5. Les meilleures pratiques de développement en PHP. G. Ponçon. – N°11676, 2005, 480 pages. Sécurité informatique. Principes et méthode à l’usage des DSI, RSSI et administrateurs. L. Bloch, C. Wolfhugel. – N°12525, 2009, 292 pages. BSD, 2e édition (coll. Cahiers de l’Admin). E. Dreyfus. – N°11463, 2004, 300 pages. Debian Lenny. Gnu/Linux . R. Hertzog, R. Mas. Dirigé par N. Makarévitch. – N°12443, 2009, 442 pages avec DVD-Rom. Nagios 3 pour la supervision et la métrologie. Déploiement, configuration et optimisation. J. Gabès. – N°12473, 2009, 510 pages Symfony. Mieux développer en PHP avec Symfony 1.2 et Doctrine. F. Potencier et H. Hamon. – N°12494, 2009, 510 pages. Zend Framework. G. Ponçon et J. Pauli. – N°12392, 2008, 460 pages. Drupal 6 et 7. Concevoir et déployer ses sites web. Y. Brault, préface d’E. Plenel. – N°12465, 2009, 404 pages. pour le développeu pour la supervisi nt aux projets autaires t Centreon. tre un parc ra, société e dans on de solutions égion de Bordeaux ssède me informatique sur les cinq s. Le langage iPhone/iPad et pour les développeurs C Nagios 3 Objective-C pour le développeur avancé Le langage iPhone/iPad et Mac OS X Conception : Nord Compo 9 7 8221 2 1 247 3 6 pour les développeurs C++/Java/C# Pier r e Y. Chatelier 45 e Pier r e Y. Chatelier ÉDITIONS EYROLLES 61, bd Saint-Germain 75240 Paris Cedex 05 www.editions-eyrolles.com Aurélie, Voilà déjà une des trois choses ; nous ferons les deux autres ensemble. Le code de la propriété intellectuelle du 1er juillet 1992 interdit en effet expressément la photocopie à usage collectif sans autorisation des ayants droit. Or, cette pratique s’est généralisée notamment dans les établissements d’enseignement, provoquant une baisse brutale des achats de livres, au point que la possibilité même pour les auteurs de créer des œuvres nouvelles et de les faire éditer correctement est aujourd’hui menacée. En application de la loi du 11 mars 1957, il est interdit de reproduire intégralement ou partiellement le présent ouvrage, sur quelque support que ce soit, sans autorisation de l’éditeur ou du Centre Français d’Exploitation du Droit de Copie, 20, rue des Grands-Augustins, 75006 Paris. © Groupe Eyrolles, 2010, ISBN : 978-2-212-12751-5 Avant-propos Pourquoi ce livre ? Si vous vous intéressez à la programmation native pour Mac OS X ou pour iPod Touch/iPhone/iPad (iPhone OS), vous ne pourrez pas échapper au langage Objective-C. Or, ce langage, en apparence né avec Mac OS X en 2001, semble un peu surgi de nulle part. Limité à l’environnement Apple, il ne fait pas partie des formations classiques des développeurs. Moi-même, il m’avait semblé être au premier abord un obstacle plutôt qu’un tremplin à la programmation pour Mac OS X : il était si peu répandu que je ne comprenais pas son intérêt face à un C++ puissant, efficace et maîtrisé. J’ai cependant découvert qu’il s’agissait au contraire d’un choix particulièrement heureux : Objective-C, par sa richesse et souplesse, est le langage le plus agréable à programmer que je connaisse. De plus, le succès de l’iPhone l’entraînant dans son sillage, la maîtrise d’Objective-C est on ne peut plus d’actualité, et sa pertinence, loin de décroître, est renforcée de jour en jour. Ce livre enseigne Objective-C, avec la particularité de comparer en permanence ses fonctionnalités avec celles des autres langages objet principaux ( Java, C++, C#). Le but avoué est en effet de remplir un espace trop souvent laissé vacant : celui des documentations Objective-C qui ne prennent pas le lecteur pour un débutant en programmation. Car très certainement, si vous êtes déjà développeur et connaissez la programmation orientée objet (POO) via le C++, le Java ou le C#, vous n’avez plus besoin d’apprendre ses paradigmes, vous les connaissez par cœur. Au contraire, vous avez sûrement plus envie de savoir comment l’Objective-C les implémente. Vous avez assez d’expérience pour apprendre le langage très rapidement, si l’on vous aiguille vers l’essentiel. VI Objective-C 2.0 pour le développeur avancé Enfin, ce livre n’est pas une documentation des API utilisées avec Objective-C, mais traite du langage en tant que tel. La connaissance d’Objective-C « pur » vous donne alors les moyens de vous adapter à tous ses cas d’utilisation, que ce soit pour Mac OS X ou iPhone OS. Les API vont forcément évoluer, peut-être en apparaîtrat-il de nouvelles, mais les concepts resteront les mêmes ; ce que vous aurez appris dans ce livre restera toujours valable. Cet ouvrage ne se présente pas comme un didacticiel mais comme une référence des concepts implémentés (ou non) par Objective-C. Il doit être possible de lire ce livre d’un bout à l’autre, puis de le consulter comme un aide-mémoire. Il permettra ainsi, je l’espère, d’éviter qu’une méconnaissance du langage conduise un développeur talentueux, soit à l’abandonner trop vite, soit à utiliser à mauvais escient ses outils habituels, produisant alors un code bâtard, inélégant et inefficace. Il ne se veut pas non plus une référence absolument exhaustive. Pour une description approfondie de certains détails techniques, qui peuvent évoluer avec le temps, la documentation officielle d’Apple reste incontournable. À qui s’adresse ce livre ? Si vous lisez ces lignes, c’est que vous avez une qualité : vous n’avez pas peur de lire une documentation. Ce livre s’adresse donc d’abord aux gens bien. Par ailleurs, cet ouvrage semble s’adresser surtout aux développeurs C++, mais c’est uniquement parce que le C++ est le langage le plus complexe du groupe C++/Java/ C#, et c’est du C++ vers l’Objective-C que la migration est la plus « difficile », car les points de comparaison sont plus nombreux. Un développeur Java ou C# pourra simplement survoler certains passages qui traitent d’une particularité C++ non pertinente dans les autres langages objet. Dans tous les cas, il s’agit de vous permettre d’apprendre Objective-C sans vous faire perdre de temps avec les bases de la programmation objet. Vos connaissances dans les autres langages vous donnent évidemment les moyens de comprendre les choses beaucoup plus rapidement qu’un novice. Partant de ce principe, les informations contenues dans les différentes sections qui suivent se veulent précises, concises et pointues. Avant-propos De C# à Objective-C Le C# est à mon sens le plus proche parent d’Objective-C. Destiné à la programmation native des applications modernes sur la plate-forme .NET de Microsoft, il fut lui aussi une sorte de renouveau du développement pour la plate-forme Windows. Pourtant, le C# souffre d’une complexité excessive pour des choses très simples dans d’autres langages, et je n’arrive pas à retrouver dans les API .NET la qualité de Cocoa. Découvrir Objective-C à partir de C# est donc relativement aisé, et ouvre l’accès à des API dont la conception est extrêmement enrichissante. De Java à Objective-C Le Java est souvent le langage choisi pour enseigner le modèle objet. Mais il n’est que rarement utilisé pour implémenter les applications spécifiques à un système donné. Le problème le plus courant est en effet de donner à un programme l’interface graphique la plus conforme aux exigences de la plate-forme, domaine où la programmation native est largement favorisée. Passer de Java à Objective-C ne présente pas de difficulté majeure, car le modèle objet y est assez similaire. Il présente toutefois des particularités très intéressantes sur la gestion mémoire, l’introspection au runtime, et l’économie de certains codes rébarbatifs. De C++/QT à Objective-C/Cocoa Pour répondre à des besoins de portabilité s’étendant aux interfaces graphiques, la plate-forme QT de Trolltech (rachetée par Nokia) a doté le C++ d’une couche graphique et d’API conviviales. Le succès de QT est en partie dû à la couche signal/slot greffée au langage C++. Cela montre par ailleurs que le C++ seul ne suffisait pas à répondre aux besoins de conception d’une interface graphique moderne. Avec un langage Objective-C relativement simple et une API Cocoa bien conçue, programmer des interfaces pour Mac OS X ou iPhone OS est agréable et rapide ; même la compilation en est accélérée. La migration vers un langage très souple et dynamique (ce que n’est pas le C++) expose souvent une autre façon de concevoir le code. Dans quelles conditions a été écrit ce livre ? La base de ce livre est en réalité une documentation écrite en 2005 sur Objective-C. À l’époque, cette documentation était surtout destinée... à moi-même ! Mise en ligne gratuitement, j’en ai reçu un retour très positif, et de nombreux lecteurs m’ont écrit VII VIII Objective-C 2.0 pour le développeur avancé pour faire part de corrections ou précisions à apporter. Cinq ans plus tard, étoffée, ajustée et peaufinée, la publication de cette documentation sous forme de livre est une sorte d’aboutissement, d’autant que ce projet est à l’initiative de l’éditeur qui a eu la bonté de la remarquer et l’apprécier. Si vous connaissez la documentation originale, vous en reconnaîtrez la structure et la majeure partie du contenu. Mais la transition du PDF-écran au papier a nécessité de nombreux ajustements pour le confort de la lecture. Au passage, de nombreuses sections ont été retravaillées et enrichies. Nous espérons ainsi que cet ouvrage trouvera sa place dans la bibliothèque des développeurs soucieux de gagner du temps et de matérialiser leur savoir au cas où Internet tomberait en panne. Structure de l’ouvrage Comme il a déjà été dit plus haut, il doit être possible de lire ce livre d’un bout à l’autre, puis de le consulter comme un aide-mémoire. Les chapitres se veulent donc très spécialisés, pour alléger les relectures en évitant les répétitions. Quelques redites sont toutefois présentes, pour éviter de multiples aller-retours lorsqu’une information est à cheval sur plusieurs concepts. Le chapitre 1 explique d’où vient et comment s’utilise Objective-C, son histoire permettant de comprendre à la fois sa conception et la raison pour laquelle il a été choisi par Apple. Le chapitre 2 détaille la syntaxe de base d’Objective-C, ce qui permet déjà de lire du code existant. Quelques nouveautés d’Objective-C 2.0 sont reportées en fin d’ouvrage pour faciliter la compréhension en première lecture. Les chapitres 3, 4 et 5 montrent comment les concepts objets (classes, héritage, instanciation) sont implémentés en Objective-C. Le chapitre 6 détaille la gestion mémoire, qui est très avantageuse une fois qu’elle est comprise. Les chapitres 7, 8 et 9 traitent des différentes fonctionnalités classiques (chaînes de caractères, exceptions, multithreading). Le chapitre 10 clôt la connaissance de la syntaxe d’Objective-C 2.0 en introduisant le concept des propriétés. C’est un outil permettant d’économiser du code. Comprendre cette section nécessite une bonne compréhension des chapitres précédents. Le chapitre 11 traite des nombreuses possibilités qu’offre l’Objective-C pour interroger ou modifier les classes lors de l’exécution du programme. Avant-propos Le chapitre 12 expose brièvement la notion de bibliothèque standard qui doit fournir avec le langage des classes de base pour travailler dans de bonnes conditions. Le chapitre 13 présente différentes évolutions d’Objective-C, montrant que le langage est maintenu au goût du jour pour satisfaire les développeurs. Y sont notamment récapitulés Objective-C 2.0 et Objective-C++. Remerciements Ce livre n’aurait sans doute pas vu le jour si sa forme initiale n’avait pas été affinée au long des mois grâce aux remarques de certains lecteurs motivés. Je tiens donc à remercier Jonathon Mah, Jean-Daniel Dupas, Jack Nutting, Ben Rimmington et Mattias Arrelid pour leur pertinence. Les amis ont également donné de leur temps pour apporter leur expertise ; Pascal Bleuyard, Jérôme Cornet, François Delobel, je suis heureux de pouvoir vous citer ici. À leurs côtés, je place Barthelemy Heyrman, pour qui la part de remerciements s’étend même au-delà de cet ouvrage. Ce livre aurait encore moins vu le jour sans Muriel, des éditions Eyrolles, qui a su l’imaginer, me convaincre de sa légitimité, et le faire évoluer avec toute la diplomatie nécessaire face au développeur farouche. Et comment ne pas non plus citer Sophie et Pascale pour leur patience face aux corrections « détaillées » et fleuries ? Un mot encore pour Gérald, Laurent et Michel de EyeNetics, avec qui il fait bon travailler ; que vivent nos projets, à l'image de celui-ci ! Et enfin, bien sûr un immense merci à ma chère Aurélie, qui a supporté toutes ces longues soirées de tapotage de clavier. IX Table des matières CHAPITRE 1 Le monde d’Objective-C ................................................................ 1 Du C au modèle objet : les principaux protagonistes . . . . . . . . . . . . . . . . . . . . . . . 1 DYNAMISME ET PERFORMANCES L’un ne chasse pas l’autre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Objective-C et ses API (Cocoa…) : les racines non Unix de Mac OS X . . . . . . . . 3 POUR EN SAVOIR PLUS Le projet GNUStep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 La bibliothèque standard Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 UN STANDARD QUI VARIE Cocoa pour Mac OS X et iPhone OS . . . . . . . . . . . . . . . . . . . . . . . . 4 La documentation officielle d’Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Compilation d’un programme Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 La bibliothèque runtime d’Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 Compilation et linkage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 POUR EN SAVOIR PLUS La notion de framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 POINT TECHNIQUE Compilation pour iPhone OS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Code minimal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7 Différences 32/64 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 POINT TECHNIQUE Cocoa et le 64 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 32 et 64 bits côte à côte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Interopérabilité d’Objective-C avec d’autres langages . . . . . . . . . . . . . . . . . . . . . . 9 CHAPITRE 2 Généralités sur la syntaxe .......................................................... 11 Les mots-clefs d’Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Les vrais mots-clefs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Les faux mots-clefs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Syntaxe autorisée par le C sous-jacent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 POINT TECHNIQUE Changer la norme C à utiliser sous gcc . . . . . . . . . . . . . . . . . . . . . . . . . 13 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13 Mélange code/déclarations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Variable de boucle for . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Nouveaux types et valeurs en Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Type BOOL, valeurs YES et NO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 XII Objective-C 2.0 pour le développeur avancé Type id, valeur nil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Type Class, valeur Nil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Type SEL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 @encode() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Organisation du code source : fichiers .h, fichiers .m et inclusion . . . . . . . . . . . . 16 Nom des classes : pourquoi NS ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17 Fonctions et méthodes : une similarité trompeuse . . . . . . . . . . . . . . . . . . . . . . . . 17 CHAPITRE 3 Classes et objets .......................................................................... 19 Classe racine, type id, valeurs nil et Nil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19 UN ŒIL SUR LA SUITE Allocation uniquement dynamique des objets . . . . . . . . . . . . . . . . . . . . 20 Déclaration des classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 Attributs et méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 STYLE DE PROGRAMMATION Nom des données membres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 AUTRES LANGAGES Le cas de struct en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22 Déclarations anticipées (forward) : @class, @protocol . . . . . . . . . . . . . . . . . . . 22 Visibilité public, protected, private . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 UN ŒIL SUR LA SUITE Héritage public, protected ou private . . . . . . . . . . . . . . . . . . . . . . . . . 24 Méthodes « privées » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24 STYLE DE PROGRAMMATION Underscore, encore . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Données membres de classe (« static ») . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Méthodes, messages et fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26 Prototype et appel, méthodes d’instance, méthodes de classe . . . . . . . . . . . . . . 26 Accès aux données d’instance de son objet déclencheur . . . . . . . . . . . . . . . . . . 28 STYLE DE PROGRAMMATION L’utilisation de self-> . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Les cibles self et super . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 SYNTAXE self et super : mots-clefs ou non ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Identifiant et signature du prototype, surcharge . . . . . . . . . . . . . . . . . . . . . . . . 31 UN ŒIL SUR LA SUITE Surcharge et méthodes virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Pointeur de méthode : le sélecteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Type SEL et @selector() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33 Divers usages de sélecteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36 Callbacks. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Paramètres par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Nombre d’arguments variable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 USAGE PRATIQUE Utilisation du nombre d’arguments variable pour les collections . . . . . . . . . 39 Arguments muets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Modificateurs de prototype (const, static, virtual, « =0 », friend, throw) . . . . . . 40 Messages et transmission . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Envoi d’un message à nil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Table des matières . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Délégation d’un message vers un objet inconnu . . . . . . . . . . . . . . . . . . . . . . . . 41 USAGE PRATIQUE Comprendre les délégués de Cocoa avec un exemple . . . . . . . . . . . . . . . . . 42 AUTRES LANGAGES delegate et event en C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Forwarding : gestion d’un message inconnu . . . . . . . . . . . . . . . . . . . . . . . . . . 42 Méthodes et fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Cohabitation cordiale . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 La fonction cachée derrière une méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Manipulations au runtime des classes et méthodes . . . . . . . . . . . . . . . . . . . . . . . 45 POUR EN SAVOIR PLUS Envoi à nil et code assembleur CHAPITRE 4 Les formes d’héritage ................................................................. 47 Héritage simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47 Héritage interdit ou limité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 UN ŒIL SUR LA SUITE final et sealed pour les méthodes en Java et C# . . . . . . . . . . . . . . . . . . 48 Membres homonymes des sous-classes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48 AUTRES LANGAGES Membres homonymes en Java et C# . . . . . . . . . . . . . . . . . . . . . . . . . . 49 Héritage multiple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49 AUTRES LANGAGES Popularité de l’héritage multiple : C++ et Python . . . . . . . . . . . . . . . . . 50 Downcasting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 Virtualité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 Méthodes virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 AUTRES LANGAGES Les garde-fous des méthodes virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . 51 Redéfinition silencieuse des méthodes virtuelles . . . . . . . . . . . . . . . . . . . . . . . 52 Surcharge et méthodes virtuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 Méthodes virtuelles pures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Héritage « virtuel » du C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Extension de classe (sans héritage) : les catégories . . . . . . . . . . . . . . . . . . . . . . . . 54 AUTRES LANGAGES Les extensions de classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 USAGE PRATIQUE Les catégories n’ajoutent que peu de contraintes au code . . . . . . . . . . . . . . 57 Classes abstraites . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Protocoles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Protocole formel : @protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 Protocole formel et méthodes optionnelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60 Protocole informel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 Objet de type Protocol . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62 Qualificateurs pour messages entre objets distants . . . . . . . . . . . . . . . . . . . . . . . 63 Utilisation conjointe de protocoles, catégories, dérivation . . . . . . . . . . . . . . . . . 64 Le design-pattern « class-cluster » . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 XIII XIV Objective-C 2.0 pour le développeur avancé CHAPITRE 5 Instanciation, destruction et copie ............................................ 67 Variable objet et pointeur d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67 AUTRES LANGAGES Pointeurs d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 POUR ALLER PLUS LOIN Créer malgré tout des objets Objective-C sur la pile . . . . . . . . . . . . . . 68 Forme de Coplien . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Constructeurs, initialisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 Distinction entre allocation et initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . 69 alloc et init : lesquels implémenter ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Type de retour d’un init : id . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 70 Syntaxe usuelle de l’application successive de alloc et init . . . . . . . . . . . . . . . . . 70 Exemple d’initialisateur correct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 self = [super init…] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 72 POUR EN SAVOIR PLUS Le blog de Wil Shipley . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73 Échec de l’initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74 Constructeur de commodité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 Constructeur par défaut : initialisateur désigné . . . . . . . . . . . . . . . . . . . . . . . . 76 Listes d’initialisation et valeur par défaut des données d’instance . . . . . . . . . . . 78 UN ŒIL SUR LA SUITE Si les données membres sont des objets C++ ? . . . . . . . . . . . . . . . . . . . . 79 Constructeur virtuel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Constructeur de classe : initialize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Destructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 POINT TECHNIQUE Destructeurs virtuels . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82 Opérateurs de copie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 Clonage classique : copy, copyWithZone: . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 NSCopyObject() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 AUTRE LANGAGES Copie binaire en C#/.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 Pseudo-clonage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Mutabilité : mutableCopy et mutableCopyWithZone: . . . . . . . . . . . . . . . . . . 87 Comparaison d’objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 Utilité de == . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 operator<() et operator==() en C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90 isEqual:, isEqualTo:, isEqualTo"QuelqueChose": . . . . . . . . . . . . . . . . . . . . . . 90 USAGE PRATIQUE isEqual pour les collections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 USAGE PRATIQUE implémenter isEqual: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 compare: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 hash: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91 USAGE PRATIQUE Les hash de Cocoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 USAGE PRATIQUE Les hash obligatoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Étendre un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92 Table des matières CHAPITRE 6 Gestion de la mémoire et ramasse-miettes .............................. 95 new et delete . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 FAUX AMI La méthode new . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 Compteur de références (retain, release) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96 POUR EN SAVOIR PLUS La bibliothèque Boost du C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 retainCount . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 Cycles de références : éviter l’abus de retain . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 DANS LA PRATIQUE Cycles de retain perfides en Cocoa . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 alloc, copy, mutableCopy, retain, release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 USAGE PRATIQUE La règle est connue, et ses pièges aussi . . . . . . . . . . . . . . . . . . . . . . . . . . 99 autorelease . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Indispensable autorelease . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Bassin d’autorelease . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 ATTENTION drain plutôt que release . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 Utilisation de plusieurs bassins d’autorelease . . . . . . . . . . . . . . . . . . . . . . . . . 102 autorelease et retain . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Prudence avec autorelease . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Efficacité et autorelease . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Exemple de l’utilité des bassins d’autorelease . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 Méthodes nécessitant une bonne compréhension de la gestion de la mémoire . 110 Constructeurs de commodité, constructeurs virtuels . . . . . . . . . . . . . . . . . . . 110 Accesseurs en écriture (mutateurs/setters) . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Assignation (code réduit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Assignation avec retenue (code réduit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Copie (code réduit) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Assignation (code complet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Assignation avec retenue (code complet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 Copie (code complet) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Pseudo-clonage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 116 Accesseurs en lecture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 117 STYLE DE PROGRAMMATION Accesseurs avec ou sans get ? . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 UN ŒIL SUR LA SUITE Atomicité de l’accesseur en lecture . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Ramasse-miettes (garbage collector) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 ATTENTION Vider un bassin d’autorelease avec drain . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Le problème du finaliseur : finalize . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 AUTRES LANGAGES Le finaliseur en Java et C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Liens faibles et forts : weak, strong . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 NSMakeCollectable() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 AutoZone . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 120 Singleton . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121 XV XVI Objective-C 2.0 pour le développeur avancé CHAPITRE 7 Les chaînes de caractères en Objective-C ................................ 125 Seuls objets « statiques » possibles d’un code source Objective-C . . . . . . . . . . . 126 NSString et les encodages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 NSString vers chaîne C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126 NSLog(), extension de format %@, description d’un objet . . . . . . . . . . . . . . . . 127 AUTRES LANGAGES Description des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 POUR EN SAVOIR PLUS Autres fonctionnalités de NSLog . . . . . . . . . . . . . . . . . . . . . . . . . . 128 NSCharacterSet, NSMutableCharacterSet . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Interprétation des chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Expressions régulières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 CHAPITRE 8 Les exceptions ........................................................................... 131 Lancer, intercepter, relancer : @try, @throw, @catch . . . . . . . . . . . . . . . . . . . . 132 @finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Méthodes « filtres » d’exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Exception non interceptée (uncaught exception) . . . . . . . . . . . . . . . . . . . . . . . . 135 Exception et bassin d’autorelease local . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Exceptions C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Spécificités 64 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 CHAPITRE 9 Le multithreading et les outils associés .................................. 139 @synchronized . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Le cas des propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 volatile . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 USAGE PRATIQUE @synchronized sur un accès à un singleton . . . . . . . . . . . . . . . . . . . . . . 141 Les utilitaires Cocoa et système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142 Les API de répartition de charge : NSOperation, Grand Central Dispatch . . . 142 Se passer du multithread . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 La boucle événementielle NSRunLoop . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 NSTimer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 144 CHAPITRE 10 Code implicite et propriétés..................................................... 145 Key-value coding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Principe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Interprétation de la clef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Prototypes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Table des matières Fonctionnalités avancées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Faiblesse du KVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Utilité des propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150 Description des propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151 Attributs des propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 Implémentations personnalisées des propriétés . . . . . . . . . . . . . . . . . . . . . . . 154 POINT TECHNIQUE Spécificité 64 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154 Syntaxe des accès aux propriétés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 L’immense différence entre « -> » et « . » . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 SYNTAXE Débat sur la pertinence du choix du point comme caractère . . . . . . . . . . . . . . 155 CHAPITRE 11 Le dynamisme et les manipulations du runtime .................... 157 De l’utilité du dynamisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 USAGE PRATIQUE Cas courant d’utilisation de l’introspection et des types dynamiques . . . . . . 158 Les RTTI du C++ (Run-Time Type Information) . . . . . . . . . . . . . . . . . . . . . . 158 Introspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 class, superclass, isMemberOfClass:, isKindOfClass: . . . . . . . . . . . . . . . . . . . 159 conformsToProtocol: . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 160 respondsToSelector:, instancesRespondToSelector: . . . . . . . . . . . . . . . . . . . 160 Typage fort ou typage faible via id . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Manipulations avancées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161 Méthode et fonction d’implémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 USAGE PRATIQUE Optimisation par IMP-caching . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Ajout d’une méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 USAGE PRATIQUE Ajouter une méthode au runtime : pour quoi faire ? . . . . . . . . . . . . . . . . 164 Chargement de classes au runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Enrichissement conditionnel du runtime . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Swizzling . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168 Binaire Objective–C et outils de consultation . . . . . . . . . . . . . . . . . . . . . . . . . . 170 CHAPITRE 12 La STL et Cocoa .......................................................................... 173 Conteneurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Les conteneurs standards . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 POUR EN SAVOIR PLUS Les performances de NSArray . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 AUTRES LANGAGES Tableau associatif en C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Stocker la valeur nil . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Gestion mémoire du contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Itérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 XVII XVIII Objective-C 2.0 pour le développeur avancé Énumération classique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Énumération rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 177 Foncteurs (objets-fonctions) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Utilisation du sélecteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 NSSortDescriptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 IMP-caching : mise en cache d’un appel de méthode . . . . . . . . . . . . . . . . . . 179 Algorithmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Fonctions de rappels (callbacks) par blocks . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 CHAPITRE 13 Les évolutions d’Objective-C : performances et extensions du langage ................................. 181 Évolution des performances d’Objective-C . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181 Appel des méthodes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 POUR EN SAVOIR PLUS Une inspection de objc_msgsend . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Migration vers le 64 bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Objective-C 2.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Objective-C++ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183 Une évolution non standard du C : les blocks . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Support du concept de closure (fermeture) . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 Capture de l’environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 Variables __block . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 187 ANNEXE A Fonctionnalités propres au C++................................................ 189 Références . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Inlining . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189 Templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 AUTRES LANGAGES Les templates en Java et C# . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 POINT TECHNIQUE Détournement du design-pattern Factory . . . . . . . . . . . . . . . . . . . . . . 190 Surcharge d’opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190 Friends . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Méthodes const . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Liste d’initialisation dans le constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Namespaces (espaces de noms) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193 Table des matières ANNEXE B Mise en correspondance des fonctionnalités C++/Objective-C 195 ANNEXE C Glossaire..................................................................................... 197 Abréviations et anglicismes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 Index........................................................................................... 199 XIX
Documents pareils
Les langages de programmation sur Mac
Les langages de programmation sur Mac 1) Introduction L'hégémonie du langage Objective-C sur Mac est dû au succès foudroyant de l'iPhone (même et surtout hors de la sphère Mac), ce langage étant in...
Plus en détail