我正在查看NSTableViewDataSource的文档,他们说这个协议仅适用于osx 10.6。怎么会这样? NSTableViewDataSource不是包含NsTableView所有数据的对象吗?
答案 0 :(得分:4)
要添加@Zydeco所写的内容,Objective-C中的@protocol
在10.5之前没有@optional
个属性。因此,Apple无法使用@protocol
来定义委托方法的内容,因为委托对象选择仅实现委托方法的一部分。 Apple在过去的日子里使用了一种称为非正式协议的东西,它们只是NSObject
类。
现在他们介绍了在@optional
中将某些方法标记为@protocol
的方法,他们决定在10.6中使每个代表成为正式协议。这样可以进行更多的编译时检查。但功能并没有改变。
有关详细信息,请参阅协议上的official documentation。
答案 1 :(得分:3)
NSTableViewDataSource作为正式协议存在于10.6中,在旧版本中,NSTableViewDataSource中的方法只是委托方法,但它的工作方式相同:在数据源对象中实现方法。
答案 2 :(得分:1)
在10.6中,Apple正式确定了许多代表和数据源非正式协议。因此,像
这样的非正式协议@interface NSObject (MyViewDataSource)
// data source methods
@end
成了
@protocol MyViewDataSource
//data source methods
@end
优点是编译器可以进行一些编译时检查,以警告您是否传递了不符合要求的实例(即没有实现NSTableViewDataSource
作为数据源,例如{{1}如果在声明类在NSTableView
中实现协议后没有实现协议的所有必需方法,则可以发出警告。
10.6之前不存在@interface
,因此如果要使用以前版本的SDK进行编译,则必须声明它。您可以这样做并将您的数据源对象(现在实现虚拟协议)作为先前SDK中的数据源传递,因为它必然也符合先前版本中定义的非正式协议。