gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 04:00:39 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com