如何处理@interface SubClass(Protected)中的方法

时间:2015-05-22 07:51:06

标签: objective-c

我从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

我尝试了,它确实可以调用超级类方法,像“受保护的”一样工作

我的问题是,为什么在没有实现的情况下在(受保护的)中声明的方法,但是可以路由到超类的实现?有人可以解释它是如何工作的吗?

1 个答案:

答案 0 :(得分:0)

该方法不受保护,因为任何代码都可以调用它,而不仅仅是子类。它只是隐藏,你必须在子类中提供一个声明,以保持编译器满意(但我怀疑它仍然抱怨[SubClass protectedMethod]尚未实现,代码仍然可以工作无论如何,声明。)

代码工作的原因是因为Objective-C运行时将消息发送到对象,无论该方法是否存在,都会抛出经典的无法识别的选择器异常。

因此,由于Objective-C的动态特性,它的工作原理是方法调用不受链接器约束并通过v-tables等实现。它们在运行时进行仲裁。有关详细信息,请参阅this reference