在 Objective-C 中,方法名称与参数交错。所以这:
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
还有这个:
- (NSInteger)numberOfRowsInSection:(NSInteger)section withTableView:(UITableView *)tableView;
在任何一个都可以用于实现相同的最终目标的意义上是等效的,它们是不可互换的。第一个方法的名称(即发送来调用它的消息)是tableView:numberOfRowsInSection:,而第二个是numberOfRowsInSection:withTableView:。正如 mipadi 所提到的,Objective-C 方法通常应该几乎像普通英语一样可读。如果您调用了 method numberOfRowsInSection:ofTableView:,我认为这是一个好名字。无论出于何种原因,这不是最初设计 API 的人选择的约定。
使用 tableView 参数的原因是,如果您有多个 tableView 都具有相同的 dataSource 对象,您可以确定正在询问哪个tableView。
在这个特定的案例中,我相信 tableView 是第一个参数的原因是为了使它更接近地匹配 OS X 上的 NSTableView 的 API,以及 Cocoa 中的其他委托方法,这些方法早于 iOS 和 UITableView。为什么决定让 tableView 在 NSTableView 的 API 中排在第一位,这已经被历史遗忘了,但同样,这就是 Apple(实际上是 NeXT)设计它的方式。