从纯粹的 API 角度来看(this 所指),这是没有意义的。如果您查看与向self
vs发送消息相关的 API super
,您会看到以下内容:
objc_msgSend:
id objc_msgSend(id theReceiver, SEL theSelector, ...)
在这种情况下,theReceiver
isself
和theSelector
is message
(之后是 args 列表,我们现在不会进入)。
将此与
objc_msgSendSuper进行比较:
id objc_msgSendSuper(struct objc_super *super, SEL op, ...)
等一下,接收器需要完全不同的类型!研究什么super
手段给了我们以下声明:
struct objc_super
{
id receiver;
Class class;
};
精明的用户会注意到这个定义在 ARC 中是无效的,但这超出了本文的范围。
那么struct objc_super
,允许我们做的是向继承链中某处的特定类发送特定消息,如果我们愿意,这实际上允许我们跳过大部分实现。
因此,话虽如此,您应该这样做的“真正”方式将是 Java 匿名类(或 C++)等价物:
[MySuperclass.self message];
但是,这是无效的,因为所有类型都self
已经声明了消息,指向它们自己!因此,我们最终使用super
关键字作为
&(struct objc_super) { self, [[self class] superclass] }
反而。