如果无论如何我都必须在对象上调用“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/