Ooooh ... Spaß Frage. Die Antwort ist ein c-ism.
Bedenken Sie:
@interface MyClass : NSObject
@end
@implementation MyClass
@end
Nun sagen Sie:
...
MyClass *m = nil;
...
In diesem Zusammenhang hat der Compiler MyClass
als Typdefinition sieht. Die *
besagt, dass die Variable m
eine pointer to a hunk o' memory that contains one (or many -- don't forget your C pointer-fu) MyClass instances
ist.
Mit anderen Worten, MyClass
ist ein Typ.
Aber im Zusammenhang mit so etwas wie:
[someInstance isKindOfClass: x ];
x
muss ein R-Wert oder, in menschlicher Hinsicht sein, der Wert eines Ausdrucks. Ein Typ kann jedoch nicht als R-Wert verwendet werden.
Das funktioniert [MyClass class]
ist eigentlich ein bisschen ein Hack, sowohl in der Sprache und dem Compiler, in dem die Grammatik ausdrücklich erlaubt, dass ein Typ-Name der Nachrichtenempfänger (das Ziel eines Methodenaufrufs sein).
Und, wie in der Tat, können Sie tun:
typedef MyClass Foo;
....
[MyClass class];
[Foo Class];
Es wird alle Arbeit. Sie können jedoch die folgenden nicht tun, aber die Fehlermeldung Beleuchtung:
[NSUInteger class];
Fehler: 'NSUInteger' ist kein Objective-C Klassenname oder Alias
Jetzt , warum nicht Sonderfall überall als bloßer Name?
Das kollidiert Typnamen und rvalues und Sie am Ende müssen schlucken etwas wie [foo isKindOfClass: (MyClass)];
während barfing auf [foo isKindOfClass: (MyClass *)];
die dann auf Typcasting Territorium in einer eher unbequemen Weise eingreift.
+1 interessante Frage! Ich hätte nie darüber nachgedacht (zumindest nicht auf diese Weise) –