Ооооо ... забавный вопрос.Ответ - c-ism.
Рассмотрим:
@interface MyClass : NSObject
@end
@implementation MyClass
@end
Теперь, скажем, у вас есть:
...
MyClass *m = nil;
...
В этом контексте компилятор видит MyClass
как определение типа.*
говорит, что переменная m
является pointer to a hunk o' memory that contains one (or many -- don't forget your C pointer-fu) MyClass instances
.
Другими словами, MyClass
является типом.
Но в контексте что-то вроде:
[someInstance isKindOfClass: x ];
x
должно быть r-значением или, с точки зрения человека, значением выражения .Тип, однако, не может быть использован в качестве значения r.
То, что [MyClass class]
работает, на самом деле является чем-то вроде хака, как в языке, так и в компиляторе, так как грамматика определенно позволяет имени типа бытьполучатель сообщения (чтобы быть целью вызова метода).
И, по сути, вы можете сделать:
typedef MyClass Foo;
....
[MyClass class];
[Foo Class];
Все будет работать.Тем не менее, вы не можете сделать следующее , но сообщение об ошибке светится:
[NSUInteger class];
ошибка: NSUInteger не является ни именем класса Objective C, ни псевдонимом
Теперь, почему бы не использовать специальный случай везде как голое имя?
Это объединяет имена типов и значения, и вы быстро заканчиваете тем, что глотаете что-то вроде [foo isKindOfClass: (MyClass)];
, в то время как раздражаете [foo isKindOfClass: (MyClass *)];
, которое затем посягаетна типографской территории довольно неудобно.