为什么我们必须在Objective-C中执行?

在Objective-C中,您可以使用以下方法调用类方法:

[MyClass aClassMethod]; 

你可以用下面的方法查询一个实例的types:

 [someInstance isKindOfClass:[MyClass class]]; 

但是,为什么我们需要做[MyClass class] ,而不是像这样简单地提供MyClass

 [someInstance isKindOfClass:MyClass]; 

是否有一个原因,编译器遇到MyClass作为接收器(指针types),而不是作为参数罚款? 这是parsing语言的限制吗? 或者可能是编译器的限制?

Ooooh …有趣的问题。 答案是c-ism。

考虑:

 @interface MyClass : NSObject @end @implementation MyClass @end 

现在,假设你有:

 ... MyClass *m = nil; ... 

在这种情况下,编译器将MyClass看作是一个types定义。 *表示variablesm是一个pointer to a hunk o' memory that contains one (or many -- don't forget your C pointer-fu) MyClass instances

换句话说, MyClass是一个types。

但是,在类似的情况下:

 [someInstance isKindOfClass: x ]; 

x必须是一个右值,或者就人而言, 是一个expression式的值 。 但是,types不能用作右值。

在语言和编译器中, [MyClass class]作用实际上是一种破解,因为语法特别允许types名称作为消息接收者(作为方法调用的目标)。

而且,事实上,你可以这样做:

 typedef MyClass Foo; .... [MyClass class]; [Foo Class]; 

这一切将工作。 但是,您不能执行以下操作, 但是错误消息是照亮的:

 [NSUInteger class]; 

错误:'NSUInteger'不是一个Objective-C的类名或别名


现在,为什么不把特殊情况当作裸露的名字?

这会勾起types名称和右值,你很快就不得不吞下像[foo isKindOfClass: (MyClass)]; 同时在[foo isKindOfClass: (MyClass *)];[foo isKindOfClass: (MyClass *)]; 从而以相当不舒服的方式侵占了types转换领域。

有趣。

在Objective-C中,类名有两个angular色:数据types和类对象。 作为数据types名称,您可以执行以下操作:

 MyClass *anObject; 

作为类对象,类名只能作为消息接收者来代表类对象。 这就是为什么你必须使用

 ... isKindOfClass:[MyClass class] ... 

但是,我不认为这是满足您的需求的答案。 对我来说,答案是:“是的,你想要的是合理的,但是规范说的是另一种方式”。

参考: Objective-C编程语言第32页,一节:“源代码中的类名” 。

@约翰和@ryanprayogo – 你们都是根本错误的。 MyClass是一个类,它也是一个对象,但不从NSObjectinheritance。 Objective-C这种方式有点奇怪,但是当它被完全解释的时候,它的确很精彩(见这里 )。 不过,这里的答案是,@yehnan说,类名可以是声明者和强制types的名称,也可以是消息的接收者。 [MyClass class]的实现返回self(即,在方法MyClass中)。 也正如@yehnan所说,这种语言可以支持把它作为一个论点,尽pipe它根本就没有。

我的第一眼看到的答案是因为[MyClass类]返回一个Classtypes的对象,而MyClass不会从Classinheritance…

@yehnan抓住了它,但我会扩大一点。 是的,编译器可以被修改为自动将类标识符转换为适用的Class ,而不是只在它是消息的目标的地方。 但是在编译器中增加复杂性的要求并不多(翻译:较慢,难以检测编码错误)。 你不应该经常调用返回Class东西。 如果你是,那么你的对象模型是坏的。 类检查应该是最后的,绝望的办法之后,一切都失败了(最显着的是正确的types,然后respondsToSelector: 。 所以对于这种罕见的事件,用这种方式使编译器复杂化并没有多大意义。

因为isKindOfClass期望的是一个“类”,这就是从调用返回的内容: [MyClass class]

我在想,MyClass实际上是一个元类。 你发送它的类消息来获得实际的类(类的类)。

MyClass不是types的Class

[MyClass class][MyClass class]的types。

如果你熟悉Java,那么概念是一样的。

java.lang.String的types不是java.lang.Class

java.lang.String.getClass()的types是java.lang.Class