协议中可选方法的重点是什么?

mor*_*des 4 protocols objective-c

如果我不得不在对象上调用"respondsToSelector:",那么定义一个方法作为可选实际上对我有什么用呢?

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

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

只要"MyClass"实现"aMethod",这个代码是否会运行完全相同或者不是MyProtocol定义的"aMethod"?

我可以看到纯粹从代码可读性的角度定义这个可选协议的用法,但是从技术的角度来看它是否真的有任何影响(除了不必在头文件中声明方法).

Bol*_*ock 8

几乎就是它在锡上所说的:它与可选功能有关.如果您的应用程序aMethod包含必要的功能,那么它应该是@required.否则,如果它为实现者提供了执行其他操作的附加功能,但是它的缺失不会对它应该工作的方式产生负面影响(即,实现者不响应@selector(aMethod)选择器就好了),你可以做到@optional.

您在视图委托协议中看到了很多.以iOS UITableViewDelegate为例:这是一组委托协议的方法,用于定义表视图的页眉和页脚的视图:

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

如果代理没有实现这些,UIKit只会绘制给定的默认部分页眉和页脚tableView,它们预先打包了默认UITableView元素.但是,如果它们被实现,UIKit将使用这些方法提供的自定义节头和页脚视图tableView.

@optional关键字几乎讲述了在写一个类来实现委托,这些方法是可选的.我相信UIKit的不conformsToProtocol:respondsToSelector:检查内部反正.

  • 关于@optional协议方法的重点.如果你有@optional方法,请确保在假定协议的conformer实现该方法之前使用`repondsToSelector:`方法.否则,将引发发送到实例<内存地址>**异常的**无法识别的选择器. (4认同)
  • 委托模式是关于"我愿意让你(委托)处理的事情",但你很快得出的结论是,并非所有可以委派的东西都需要委派.在协议中使用可选方法只是对采用者的暗示; "你可以实现这些方法,但你不必这样做." 对于那些说'我们不应该检查respondsToSelector'的人,我引用你的想法:http://borkware.com/rants/agentm/elegant-delegation/ (2认同)