为什么我们必须在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