Ooooh... question amusante. La réponse est un c-isme.
Pensez-y :
@interface MyClass : NSObject
@end
@implementation MyClass
@end
Maintenant, disons que vous l'avez fait :
...
MyClass *m = nil;
...
Dans ce contexte, le compilateur voit MyClass
comme définition de type. Le site *
dit que la variable m
est un pointer to a hunk o' memory that contains one (or many -- don't forget your C pointer-fu) MyClass instances
.
En d'autres termes, MyClass
est un type.
Mais, dans le contexte de quelque chose comme :
[someInstance isKindOfClass: x ];
x
doit être une rvalue ou, en termes humains, la valeur d'une expression . Un type, cependant, ne peut pas être utilisé comme une rvalue.
Ce [MyClass class]
est en fait un peu un hack, à la fois dans le langage et dans le compilateur, car la grammaire permet spécifiquement à un nom de type d'être le récepteur du message (d'être la cible d'un appel de méthode).
Et, en fait, vous pouvez le faire :
typedef MyClass Foo;
....
[MyClass class];
[Foo Class];
Ça va marcher. Cependant, vous ne pouvez pas faire ce qui suit mais le message d'erreur est allumé :
[NSUInteger class];
error : 'NSUInteger' n'est pas un nom de classe ou un alias en Objective-C
Maintenant, pourquoi ne pas le mettre en cas spécial partout comme un nom nu ?
Cela mélange les noms de types et les valeurs r et vous finissez rapidement par devoir avaler quelque chose comme [foo isKindOfClass: (MyClass)];
en vomissant sur [foo isKindOfClass: (MyClass *)];
ce qui empiète sur le terrain des stéréotypes d'une manière plutôt inconfortable.