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