Pros/cons 实施一组特定的委托方法与不实施它们以及实施一个而不实施另一个的效果?

Pros/cons of implementing a particular set of delegate methods versus not implementing them and the effects of implementing one but not another?

关于 UITableView & UICollectionView 及其各自的协议,UITableViewDataSource & UITableViewDelegate + UICollectionViewDelegate & UICollectionViewDataSource -- 是实施一种方法而不实施另一种方法或一组特定方法而不实施其余方法或特定方法的独特组合有任何优缺点?

例如,如果我要实施 heightForFooter 而不是 viewForFooter - 会发生什么或可能发生什么?这是否会对性能或 table 视图的滚动产生负面影响?

是否有指南表明如果实施了哪些方法,则应将其他方法组合起来并与它们一起双重实施?

回复:正确性

Is there a guide which shows that which if any methods are implemented, others should be combined and dually implemented alongside them?

不是我所看到的,尽管有时文档会提到它。例如。来自 the docs of NSTableViewDataSource:

If you’re not using Cocoa bindings to provide data to the table view, the following methods are required:

  • numberOfRows(in:)
  • tableView(_:objectValueFor:row:)
  • tableView(_:setObjectValue:for:row:) (cell-based tables only)

一般来说,如果一个方法是可选的,但上下文需要,那么会有一个运行时错误告诉你实现它,例如:

Illegal NSTableView data source (Foo). Must implement numberOfRowsInTableView: and tableView:objectValueForTableColumn:row:

要么那样,要么东西会悄无声息地失败(例如,如果你不实现 NSTableViewDelegate.tableView(_:viewFor:row:),就不会进行绘图,你所有的单元格都只是空白视图。

回复:性能

不实现可选方法应该不会有任何真正的性能差异。

这些方法中的每一个都可能被调用,就好像您在 Swift 中有它一样(这些框架中的大多数仍在 Objective C 中实现):

let result: Result? = yourTarget.someMethod?(someArg)

这实际上只是 shorthand 用于:

let result: Result? = yourTarget.responds(to: #selector(YourTargetsClass.someMethod))
    ? target.method(someArg)
    : nil

也就是说,这是一个动态方法查找,用于检查您的对象是否响应消息,并且发送一个动态消息以实际调用该方法(对于它确实响应的情况)。

这里有一个很小的优化可以挤出来:如果你的方法实现是空的,那么你最好根本没有它。这将防止不必要的消息发送。尽管在您确定它是分析器中的热点之前,这显然不是什么值得担心的事情。

当然,没有什么能阻止图书馆作者写作:

if yourObject.responds(to: #selector(someMessage)) {
    doSomethingVeryExpensiveForNoGoodReason()
}

...但这不太可能。