2

我正在查看 NSTableViewDataSource 的文档,他们说该协议仅在 osx 10.6 上可用。怎么会这样?NSTableViewDataSource 不是包含 NsTableView 的所有数据的对象吗?

4

3 回答 3

4

要添加@Zydeco 写的内容@protocol,Objective-C 中的 s 在 10.5 之前没有@optional属性。所以,Apple 不能@protocol用来定义什么是委托方法,因为委托对象选择只实现一部分委托方法。在过去,Apple 使用了一种称为非正式协议的东西,它们只是NSObject类别。

既然他们介绍了将一些方法标记为@optionala 的方法@protocol,他们决定在 10.6 中使每个委托都成为正式协议。这样可以进行更多的编译时检查。但功能并没有改变。

有关更多信息,请参阅有关协议的官方文档

于 2010-01-27T19:35:25.757 回答
3

NSTableViewDataSource 作为正式协议存在于 10.6 中,在旧版本中,NSTableViewDataSource 中的方法只是委托方法,但它的工作方式相同:您在数据源对象中实现方法。

于 2010-01-27T19:09:21.760 回答
1

在 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 中的数据源传递,因为它也必须符合那些先前版本中定义的非正式协议。

于 2010-01-27T19:32:48.667 回答