Précédent

Table des matières

Suivant



OpenStep, GNUstep et Cocoa


L'API OpenStep (GNUStep, Cocoa)


L'API OpenStep s'apparente à l'API proposée par SUN pour java. Elle confère aux programmeurs un ensemble d'objets prédéfinis qui peuvent servir de briques simples pour stocker des données, les afficher, les traiter etc... Toutes ces classes sont préfixées par les lettres NS . La plus connue est la classe NSObject. C'est aussi la racine de toute la hiérarchie des classes NS(...).


La classe NSObject


Son rôle est de contenir tous les mécanismes simples qui implémente la base d'un objet de l'API OpenStep. Dans ces mécanismes, on trouve l'allocation, de desallocation et d'initialisation de l'objet. Voici par exemple l'utilisation courante des méthodes alloc et init:

id obj=[[NSObject alloc]init ];
NSButton bouton=[[NSButton alloc]init ];

Comme on peut le remarquer, c'est un des rares langages modernes à ce lire de gauche a droite. En effet dans la première ligne a droite du signe égal, on lit que l'objet NSObject (ici la classe) reçoit un message d'allocation (alloc) puis le résultat reçoit un message d'initialisation (init).

Dans cette exemple, la fonction alloc est une méthode de la classe tandis que la méthode init est une méthode de l'objet renvoyé par la méthode alloc. Vous trouverez ici comment on déclare les méthodes en objective-C.

Enfin cette classe contient une méthode appelée de manière implicite par le "garbage collector" fournit dans l'API OpenStep: desalloc. Celle-ci implémentée et appelée pour vous par le système doit être reécrite seulement si votre objet alloue explicitement de la mémoire.


L'heritage


Le pointeur isa

La méthode d'allocation alloc de la classe NSObject, alloue l'espace mémoire pour les variables d'instance de l'objet et les initialise toutes à zéro. Toutes à l'exception du pointeur isa qu'elle connecte vers sa classe. Si l'objet est une classe elle la connectera à sa super-classe en remontant ainsi l'arborescence jusqu'à la classe racine (couramment NSObjet). Ce pointeur représente donc les liens de hierarchie entre les objets.

Les mots clés

Il existe deux mots pour naviguer facilement dans la hierachie des classes :


On peut définir les variables d'instances avec plusieur types d'accés :

Comme en java, le type @public permet l'accés aux variables d'instances à tous les.objets; @protected seulement aux objets héritants de la classe; @private limite l'accés à la classe.



Le fonctionnement des messages


La fonction obj_msgSend et le pointeur isa

La fonction obj_msgSend() , appelée lors de l'émission d'un message, doit se charger de localiser la bonne procédure au moment de l'exécution. La procédure part de la structure de l'objet instancié et suit le pointeur isa de sa structure. La fonction tente alors de trouver le sélecteur dans la « dispatch table » de la classe courante. Tant qu'elle échoue elle remontera l'arborescence des classes. Si elle trouve le bon sélecteur, elle invoquera la méthode correspondante et retournera le résultat comme sa propre valeur de retour.

Les sélecteurs et les « dispatch tables »

Afin d'améliorer le processus, au moment de l'exécution la fonction recherche des sélecteur et non pas des prototypes de méthodes sous formes de suites de caractères; cela impliquerais des comparaisons multiples de chaînes de caractères. Donc dans la hiérarchie des objets classes, on trouve pour chaque classe une « dispatch table » où est associé à chaque sélecteur une adresse de méthode.

Le compilateur et l'environnement d'exécution s'assurent d'avoir le même sélecteur pour les même prototypes de méthodes. Les sélecteurs sont d'un type particulier au langage: SEL. Un sélecteur valide est non nul. Il existe deux façons d'accéder aux sélecteurs depuis la chaîne de caractères représentant le prototype d'une méthode. Tout d'abord de façon statique au moment de la compilation :

SEL gi;
gi = @selector(add::);

Ou de manière dynamique pendant l'exécution du programme:

SEL gi;
gi = NSSelectorFromString();  // définition de Cocoa
gi = sel_getUid();            // définition d'OpenStep ?



N.B.: L'opération inverse est possible grâce à la fonction (NSString *)NSStringFromSelector(SEL s).



En plus des « dispatch tables », chaque objet classe contient un cache comprenant une liste de paires sélecteur<->adresse_de_méthode. Dans ce cache on trouve les sélecteurs des super-classes déjà appelé par le programme. Ces caches sont gérés dynamiquement par l'environnement d'exécution et permettent d'accélérer au fur et à mesure de l'exécution le mécanisme dynamique de messagerie. Le programme évite alors de remonter toutes la chaîne des pointeurs isa.





La classe NSProxy


Bientôt...



Précédent

Table des matières

Suivant