Cocoa
Cocoa regroupe le framework Foundation et AppKit. Foundation propose les briques logiques de base pour manipuler nombres, textes, fichiers, threads, etc. Appkit s’appuye sur Foundation pour présenter des applications graphiques riches. Cocoa encourage à développer autour d’une architecture MVC, à envoyer des Notifications plutot que de manipuler directement la mémoire et à créer des deeléguees plutot que de sous classer les composants des vues qui nous intréressent.
Delegates
Lié au paradigme des protocoles informels. Une librairie peut signaler qu’un objet peut repondre à des selecteurs, mais sans garantie. Un delegate est un objet qui peut, si il le souhaite répondre à des notifications. Cela évite de sous-classer des objets de l’Appkit lorsqu’on souhaite en modifier le comportement.
Dans un NSOutlineView, si on veut detecter le clic
sur chaque ligne pour afficher un aperçu de la ligne
par exemple, sans delegate on devrait sous classer
NSOutlineView, implementer nous meme une methode
onClick, calculer sur quelle ligne on clique, etc.
Plutot que de faire cela, NSOutlineView fait un tel
travail en interne, et regarde si un delegate lui
est associé. Si c’est le cas, et si ce delegate
repond au selecteur, celui-ci est appellé
avec le ou les numeeros de ligne cliqués.
Une telle façon est plus robuste que d’implementer
soi meme toute la logique de clic, par exemple
si dans le futur les outline view decident de changer
leurs marges, leur hauteur de case, etc.
Les protocoles formels en sont une amélioration car la classe qui gere un déleegué n’a pas besoin de vérifier avant chaque appel si le délégué répond bien au sélecteur, et plutot que de créer des classes déleeguées très longues, il suffit d’implémenter uniquement les fonctions intéressantes : Objective-C 2.0 : Protocol 🌍⤴
Notifications
Les composants de Cocoa peuvent communique entre eux, et le systeme en fait de meme lorsque l’utilisateur clique sur la souris ouy appuye sur une touche du clavier.
N’importe quel objet peut écouter les notifications qui
l’intéressent, NSApplicationWillClose, NSTextDidBeginEditing, etc.
Les composants livrés par défaut le font déjà pour nous
et en informent leur délégués, mais si on souhaite crée
nos propres composants réutilisables, il faut bien cerner ce système.
Un bon article qui traite du sujet : https://nshipster.com/nsnotification-and-nsnotificationcenter/ 🌍⤴
Dans l’idée selon qu’on veuille notifier une action a un ou plusieurs eléments, il y a une maniere couplée et une maniere lache.
| solo | plusieurs | |
|---|---|---|
| lache | action, callback, delegate | NSNotification |
| couple | appel de fonction | KVC |
MVC
Cocoa encourage a séparer la logique métier en modèles qui ignorent tout de l’UI et n’utilisent aucune fonction de l’AppKit, en controlleurs qui font le lien avec le GUI, et les vues qui sont présentées à l’utilisateur et construites avec Interface Builder.
Initialement Cocoa etait un framework axé “vues” avec son
interface builder et ses IBOutlet et ses IBAction,
puis avec les “Cocoa Binding” et les NS*Controller,
l’aspect “Controlleur”
a été pris en charge. Avec “Core Data”, l’aspect
“modèle” a finalement été traité. En 2007 on peut considerer
Cocoa comme un framework MVC complet.
Asyncronicité
Threads mach, threads Posix, NSThread,
[NSURLConnection initWithRequest:delegate:startImmediatly:], scheduleInRunLoop:forMode,
unscheduleFromRunLoop:forMode,
performSelectorInBackground:@selector(doWork:) withObject:data,
performSelectorOnMainThread:@selector(finished:) withObject:data waitUntilDone:
NSOperation, NSOperationQueue.
Historique des versions
| Nom de code | Version de Mac OS X | Date de sortie |
|---|---|---|
| Cheetah | 10.0 | Mars 2001 |
| Puma | 10.1 | Septembre 2001 |
| Jaguar | 10.2 | Aout 2002 |
| Panther | 10.3 | Octobre 2003 |
| Tiger | 10.4 | Avril 2005 |
2001 : Cheetah, version 10.0
Evolution de NextStep qui proposait déjà un système de services pour communiquer entre différentes applications : on peut sélectionner par exemple du texte et lancer un service “dictionnaire” pour en avoir une définition. Le dock pour lancer rapidement des application est déplacé de la droite de l’écran vers le bas.
Une grande importance est donnée à Carbon et au portage d’Application de MacOS 9.
La systeme Darwin est introduit avec ses interfaces BSD (POSIX : printf, pthread, malloc/free…) et Mach (threads , mémoire virtuelle 🌍⤴ (vm_allocate/vm_deallocate…), tasks (processus executant des threads dans un espace isolé du systeme), messages inter-processus, gestion de plusieurs processeurs…).
Les systemes graphiques Quartz (passage de Postscript vers PDF),
OpenGL et Quicktime sont introduits, QuickDraw et Sprockets
sont dépréciés.
Les frameworks d’applicatione Carbon, Classic et Cocoa sont présents. Les application Classic peuvent s’ececuter nativement à condition d’utiliser Carbon et les types CoreFoundation qui permettent la migration vers Unicode et les systemes de fichier HFS+, sinon elles s’exécutent dans une “Blue Box” à condition qu’elles ne manipulent pas le materiel directement.
Unicode est adopté dans les API POSIX et CoreFoundation (CFString) qui sont accessible à Carbon et Cocoa.
Cocoa permet de créer des applications en partant de l’interface utilisateur au lieu de commencer par du code. Il se base sur Foundation mais peut utiliser CoreFoundation quand la performance du C++ est nécessaire ou si le projet mélange Carbon et Cocoa.
AppKit permet de construire des application graphiques sur le modele MVC, la délégation et les notifications, et propose des boutons, barres d’outils, et autres éléments interactifs qui épousent les formes souhaitées de l’architecture Cocoa.
Appkit s’appuye sur Foundation et des décenies d’experience en creation GUI d’Apple.
Aqua donne un aspect unifié à tout cela, a la fois pour les Apps Carbon et Cocoa. Il aide a créer des interface cohérentes grace à des guides dans Interface Builder et à des recommendations écrites : “Human Interface guidelines”.
Le langage XML est omnipresent : préférences, packaging d’apps, drivers, plugins, presse-papiers…
Les standards sont adoptés : TCP/IP au lieu de AppleTalk, SMTP/POP, HTML, FTP, serveur apache inclus (HTTP)…
Java 2 est pris en charge et mis en avant, avec un bridge vers Cocoa, mais aussi les application Java Swing qui sont multiplateformes et tournent sur Windows, Mac, Solaris ou encore Linux… Les WebObjects permettent de creer des sites web dynamiques à la manière de PHP. Sur Mac, les application Swing peuvent adopter le look Aqua.
Le support de BSD 4.4 permet de faire fonctionner des milliers
de programmes UNIX comme ssh, apache, grep… mais aussi
de lier à des librairies POSIX comme stdio, pthread…
Le serveur d’affichage X n’est pas prise en charge, ce qui
limite les aplications UNIX à la ligne de commande ou aux
services d’arrière plan.
Les programmes Classic peuvent s’exécuter dans une machine virtuelle (gérée par Mach), mais devront à terme être portées. Les applications peuvent être Carbonisées, de même pour les plugins (CFBundle et CFPlugIn). Les drivers doivent être portés vers I/O Kit.
Carbon implémente toutes les API de Classic qui sont compatibles avec un systeme UNIX sécurisé : les anciennes API qui consistaient à manipuler directement la mémoire systeme non protégée et pouvaient le faire planter doivent etre remplacées par des API nouvelles, mais 90% des API sont préservées ce qui permet un portage simplifié de Classic vers Cocoa. MacOS 9 supporte Carbon via “Carbon Lib”, donc Carbon permet d’écrire des application “universelles”.
Slides : https://archive.org/details/wwdc2001-slides/100_mac_os_x_update 🌍⤴
2001 à 2002 : Puma 10.1
iTunes permet de lire les CD, d’en extraire la musique et de graver des CD
2002 à 2003 : Jaguar 10.2
Quartz extreme permet de rendre les fenetres via GPU ce qui rend le systeme beaucoup plus réactif.
2003 à 2005 : Panther 10.3
Safari remplace Internet Explorer.
De mi-2005 à fin 2007 : Tiger 10.4
Version de Mac OSX éprouvée et stable et qui dépasse en popularité MacOS 9. Premiere version de de OSX qui a rencontré un grand public. Se prositionne comme concurrent à Windows Vista. OSX était considéré comme un systeme expérimental en “phase beta” et MacOS 9 était considéré comme la version stable et productive.
Aspect metal brossé (“textured windows”) se généralise. NSDrawer laisse généralement place aux NSSplitView. Fenetres aux bordures et séparateurs épais typiques de cette version de l’OS.
Objective C 2.0, les propriétés remplacent les attributs
de classe des interfaces. Pointeurs forts et faibles
(__weak, __strong)
pour assister le garbage collector dans la résolution
de cycles. Accès atomiques ou non avec nonatomic
permet des gans de performace.
Ajout des @protocol au lieu des categories.
Arrivée des power PC 64 bits. Les API passent donc
en 64 bits, recommande de remplacer int
par NSInteger, float par CGFloat, unsigned par NSUInteger.
Les API Carbon restent en 32 bits, et de nombreuses API existantes
de Carbon ont été portées vers Cocoa.
NSBlockOperation sont une API qui fonctione avec “Grand Central Dispatch”
et les “blocs” qui ont été ajoutés au langage, permettent du code
concurrentiel bien plus facilement qu’avec les
thread POSIX
.
Fin 2007 à fin 2009 : Leopard
Passage du look metal brossé, marges et diviseurs larges vers gris uni, diviseurs et marges invisibles. Le dock est incliné. Sherlock est totalement supprimmé au profit de Spotlight.
Arrêt du support de Mac Classique en parallele de l’abandon de plus en plus marqué de Carbon.
Arrivée de l’iPhone et des améliorations de XCode rendant possible le développement d’applications Cocoa Touch.
Les fenetre viennent avec des barres inférieures et des controles de taille réduite.
Des panels transparents “HUD panel” permettent d’afficher des panels moins distrayants.
Arrivée du garbage collector : finalize remplace dealloc,
de nombreuses techniques permettent d’éviter à écrire
une fonction finalize.
Version fin 2009 a fin 2011 : Snow Lepoard (10.6)
Arret du support des Macs Power PC.
Arrivée de l’App Store, boom de Cocoa Touch, popularité croissante des iPhones et autres Macintosh.
Nouveautés de Lion (2011, 10.7)
Arret du support des architectures 32 bits, abandon programmé de Carbon qui surviendra en 2019, avec MacOS 10.15 Catalina.
Autosave et restoration automatique de son app, plus besoin de CMD+S dans sa routine de travail. iCloud est disponible sur Mac pour les documents et les préférences utilisateur.
Apparition de Autolayout, mais on doit toujours utiliser ibtool.
NSCellView permet de créer des tableaux et des outlines plus simplement.
NSPopover ajoute des “tooltip” interactifs aux boutons.
Arrivée des écran hdpi (retina), l’unité de mesure n’est plus le pixel mais le point.
Seuls les slides sont disponibles : https://archive.org/details/wwdc2011-slides 🌍⤴
Nouveautés de Mountain Lion (2012, 10.8)
Priorité est donnée aux interfaces multilingues, la gestion des ecritures de droite à gauche, disparition des 30aines de fichiers .nib pour gerer le multilinguisme.
Le librairie FoundationCore commence à être délaissée, il y a moins besoin des performances accrues d’une librairie C++ par rapport a une librairie ObjC Cocoa.
Autolayout
Pour avoir des applications multilingues il n’est plus necessaire
d’avoir 30 fichiers .nib, mais un seul suffit : voir la video
What’s new in Cocoa, session 204, WWDC 2012, 41:30
🌍⤴
Car différents langages avaient différentes contraintes d’espacement,
et un texte en allemand peut déborder si l’interface est concue pour
de l’anglais. Si on changait le .nib original, ibtool synchronise
ces changements dans les .nibs locaux. “Autolayout” résoud ce problème.
Vidéos indispensables pour comprendre “Autolayout”
- AutoLayout by Example, WWDC 2012 🌍⤴ (outils de debugage, ajout dynamique de contenu (ancienne methode/nouvelle))
Sessions WWDC
- 1997 : Videos https://archive.org/details/10-opening-keynote 🌍⤴ (Rhapsody)
- 2001 : Slides https://archive.org/details/wwdc2001-slides 🌍⤴ (Cheetah) et DVD https://archive.org/details/wwdc-2001-dvd-1-iso 🌍⤴
- 2002 : Slides https://archive.org/details/wwdc2002-slides 🌍⤴ (Jaguar) et DVD https://archive.org/details/Wwdc2002DvdSet 🌍⤴
- 2003 : Slides https://archive.org/details/wwdc2003-slides 🌍⤴
- 2004 : Slides https://archive.org/details/wwdc2004-slides 🌍⤴
- 2005 : Slides https://archive.org/details/wwdc2005-slides 🌍⤴
- 2006 : Slides https://archive.org/details/wwdc2006-slides 🌍⤴
- 2007 : Slides https://archive.org/details/wwdc2007-slides 🌍⤴ et videos https://archive.org/details/2007-session-616-designing-and-developing-hybrid-web-or-cocoa-applications 🌍⤴
- 2008 : Slides https://archive.org/details/wwdc2008-slides 🌍⤴ et videos https://archive.org/details/2008-session-725-application-printing-in-mac-os-x 🌍⤴
- 2009 : Slides https://archive.org/details/wwdc2008-slides 🌍⤴ et videos https://archive.org/details/2008-session-725-application-printing-in-mac-os-x 🌍⤴
- 2010 : Slides https://archive.org/details/wwdc2010-slides 🌍⤴
- 2011 : Slides https://archive.org/details/wwdc2011-slides 🌍⤴
- 2012 : Slides https://archive.org/details/wwdc2012-slides 🌍⤴ et videos https://archive.org/details/wwdc-2012-sessions 🌍⤴
- 2013 : Slides https://archive.org/details/wwdc2013-slides 🌍⤴
- 2014 : Slides https://archive.org/details/wwdc2014-slides 🌍⤴ et sessions https://archive.org/details/wwdc-2014-videos-sessions 🌍⤴
- 2015 : Slides https://archive.org/details/wwdc2015-slides 🌍⤴
- 2016 : Slides https://archive.org/details/wwdc2016-slides 🌍⤴
- 2017 : Slides https://archive.org/details/wwdc2017-slides 🌍⤴
- 2018 : Slides https://archive.org/details/wwdc2018-slides 🌍⤴
- 2019 : Slides https://archive.org/details/wwdc2019-slides 🌍⤴
Le reste est accessible dans l’application “Developer”.