2010-11-10 4 views

Répondre

9

De The Objective-C Programming Language:

id est défini comme pointeur vers une structure de données d'objet:

typedef struct objc_object { 
    Class isa; 
} *id; 

et surtout

Le type d'identification est complètement non limitatif. En soi, il ne fournit aucune information sur un objet, sauf qu'il s'agit d'un objet. À un certain point, un programme a généralement besoin de trouver des informations plus spécifiques sur les objets qu'il contient. Étant donné que le désignateur de type d'identification ne peut pas fournir cette information au compilateur, chaque objet doit être en mesure de le fournir lors de l'exécution.

La variable d'instance isa identifie la classe de l'objet - quel type d'objet il s'agit. Les objets ayant le même comportement (méthodes) et les mêmes types de données (variables d'instance) sont des membres de la même classe.

Les objets sont ainsi dynamiquement saisis lors de l'exécution. Chaque fois que cela est nécessaire, le système d'exécution peut trouver la classe exacte à laquelle un objet appartient, en demandant simplement à l'objet. (Pour en savoir plus sur le moteur d'exécution, reportez-vous au Guide de programmation d'exécution d'Objective-C). Le typage dynamique dans Objective-C sert de base à la liaison dynamique, comme nous le verrons plus tard.

6

Vraiment dynamique. Il n'y a même pas de vérification de type statique (sauf si vous déclarez la liste de protocoles pour la variable). Il est défini simplement comme un pointeur vers un objet. Par exemple, vous pouvez le faire:

Class classes[3]; 
classes[0] = [NSMutableString class]; 
classes[1] = [NSMutableArray class]; 
classes[2] = [NSMutableData class]; 
srandom(time(NULL)); 
id foo = [[classes[random % 3] alloc] init]; 
NSLog(@"It is a %@", [foo class]); 
+0

+1 extrait de code brillant. –