objective-c - 协议(protocol)中可选方法的意义何在?

标签 objective-c protocols

如果无论如何我都必须在对象上调用“respondsToSelector:”,那么将一个方法定义为可选方法实际上对我有什么作用?

例如,假设我有这样的代码

id<MyProtocol> myObj = [[MyClass alloc] init];
if([myObj respondsToSelector:@selector(aMethod)]){
  [myObject aMethod];
}

只要“MyClass”实现了“aMethod”,无论 MyProtocol 是否定义了“aMethod”,这段代码运行起来不会完全一样吗?

我可以看到纯粹从代码可读性的角度定义这个可选协议(protocol)的用途,但不明白它是否真的从技术角度产生任何影响(除了不需要在 header 中声明该方法)。

最佳答案

几乎如包装上所说:它与可选功能有关。如果您的aMethod 包含必要 功能以便您的应用程序正常工作,则它应该是@required。否则,如果它为实现者提供额外的功能来做其他事情,但它的缺席不会对它的工作方式产生负面影响(即,实现者不响应 @selector(aMethod) 选择器),你可以将它设为 @optional

您在 View 委托(delegate)协议(protocol)中看到很多。以 iOS 的 UITableViewDelegate 为例:这是一组委托(delegate)协议(protocol)的方法,用于定义 TableView 的节页眉和页脚的 View :

  • tableView:viewForHeaderInSection:
  • tableView:viewForFooterInSection:
  • tableView:heightForHeaderInSection:
  • tableView:heightForFooterInSection:

如果委托(delegate)没有实现这些,UIKit 只是为给定的 tableView 绘制默认的部分页眉和页脚,它们与默认的 UITableView 元素一起预先打包.但是,如果实现了它们,UIKit 将使用这些方法提供的自定义部分页眉和页脚 View 以及 tableView

@optional 关键字几乎告诉 编写一个类来实现委托(delegate),这些方法是可选的。我相信 UIKit 确实会在内部检查 conformsToProtocol:respondsToSelector:

关于objective-c - 协议(protocol)中可选方法的意义何在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4839284/

相关文章:

objective-c - 将 CGEvent 发布到 PSN 时的奇怪行为

ios - 当 segue 完成时,NSString 被删除

Objective-C - iOS - 类方法行为不正常

ios - 目标 - C、协议(protocol)、数组、字典 - 测试

http - Pragma 和 Cache-Control header 之间的区别?

c - 在 C 中非常快速地发送多个包

objective-c - 使用图像在按钮上动画

Swift 协议(protocol)扩展 - 无法访问 Func

swift - 是否可以通过协议(protocol)自定义UINavigationBar?

iphone - iPhone Tab Bar应用程序崩溃