我从Protected methods in Objective-C
获得了示例代码它有一个答案如下:
/////// SuperClass.h
@interface SuperClass
@end
/////// SuperClass.m
@implementation SuperClass
- (void) protectedMethod
{}
@end
/////// SubClass.h
@interface SubClass : SuperClass
@end
/////// SubClass.m
@interface SubClass (Protected)
- (void) protectedMethod ;
@end
@implementation SubClass
- (void) callerOfProtectedMethod
{
// this will not generate warning and call super's protectedMethod
[self protectedMethod];
}
@end
我尝试了,它确实可以调用超级类方法,像“受保护的”一样工作
我的问题是,为什么在没有实现的情况下在(受保护的)中声明的方法,但是可以路由到超类的实现?有人可以解释它是如何工作的吗?
答案 0 :(得分:0)
该方法不受保护,因为任何代码都可以调用它,而不仅仅是子类。它只是隐藏,你必须在子类中提供一个声明,以保持编译器满意(但我怀疑它仍然抱怨[SubClass protectedMethod]
尚未实现,代码仍然可以工作无论如何,声明。)
代码工作的原因是因为Objective-C运行时将消息发送到对象,无论该方法是否存在,都会抛出经典的无法识别的选择器异常。
因此,由于Objective-C的动态特性,它的工作原理是方法调用不受链接器约束并通过v-tables等实现。它们在运行时进行仲裁。有关详细信息,请参阅this reference。