不符合协议的实现方法

时间:2012-05-18 08:39:38

标签: objective-c cocoa-touch

在我的TheTabBarController中,如果不符合UINavigationControllerDelegate协议,我可以将我的类分配给moreNavigationController.delegate。

// without conforming to protocol, <UINavigationControllerDelegate>
@interface TheTabBarController : UITabBarController 

self.moreNavigationController.delegate = self;

它只是引发了以下警告,但成功编译。

  

从不兼容的方式分配给'id'   输入'TheTabBarController * const __strong'

协议的方法在运行时调用,没有任何错误。我用它来隐藏一些视图控制器的更多导航栏。

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated

所以,我想知道,这是合法的,安全的还是;它会在以后崩溃还是泄漏内存?怎么能在语义上允许这个?运行时如何解析方法,虽然它没有在接口中定义,并且协议不符合?或者,UITabBarController使用符合协议的隐藏类别?

1 个答案:

答案 0 :(得分:1)

协议没有运行时含义。它们仅在编译期间用于在您尝试执行此类操作时显示类型错误。如果它实现了协议,为什么你不希望TheTabBarController成为UINavigationControllerDelegate

在Objective-C中,您可以在任何对象上调用任何方法,它可以通过实现forwardInvocation:(NSInvocation *)anInvocation或其中一个相关方法来处理它。您还可以使用objc_install_instance_method和相关函数在运行时向对象或类添加新方法。