La super-classe type d'idée, alors qu'une bonne théorie, n'a pas vraiment debout: Un NSString *
est un NSObject *
. Il n'y a pas de raison qu'il ne peut pas être cité en tant que tel.
Au lieu de cela, je pense qu'il a plus à voir avec les signatures de fonction. Dans un langage dynamique comme Objective-C, vous pouvez avoir aucune idée de quelle classe vous êtes à la messagerie. Mais le compilateur doit savoir de quel type est retourné. Que et Objective-C de l'histoire de la convention de base de la programmation (plutôt que d'avoir des règles strictes) signifie que votre sous-classe peut retourner un NSRect
a struct
) ou NSInteger
(un scalaire) à partir de init
. C'était dingue, mais valide.
C++ a un problème similaire, voir Est le type de retour de la partie de la signature de la fonction?.
Nous avons donc besoin d'un type unique pour toutes les méthodes avec signature de l' -(id)init
, et id
était la seule chose qui fait sens qu'il indique seulement que le type de retour est un exemple. C'est assez pour le compilateur de faire la bonne chose. Maintenant, nous avons instancetype
, ce qui correspond à la classe de messaged.