在我的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使用符合协议的隐藏类别?
答案 0 :(得分:1)
协议没有运行时含义。它们仅在编译期间用于在您尝试执行此类操作时显示类型错误。如果它实现了协议,为什么你不希望TheTabBarController
成为UINavigationControllerDelegate
?
在Objective-C中,您可以在任何对象上调用任何方法,它可以通过实现forwardInvocation:(NSInvocation *)anInvocation
或其中一个相关方法来处理它。您还可以使用objc_install_instance_method
和相关函数在运行时向对象或类添加新方法。