我的理解是,协议(protocol)就像其他语言中的接口(interface)——它们声明预期的方法——而类别允许您向现有类型(甚至可能是您不拥有的类型)添加新方法。
那么,为什么 iPhone SDK 有时会使用类别来声明委托(delegate)类型?通常我希望所有委托(delegate)的类型都为 id
例如,参见 NSURLConnection。它的委托(delegate)类型为“id”,“契约(Contract)”被声明为 NSObject (NSURLConnectionDelegate) 上的一个类别。
那么:在这些情况下使用类别的动机是什么?
最佳答案
Objective-C 2.0 引入了@optional 协议(protocol)指令,允许您将某些协议(protocol)方法声明为可选。在 Obj-C 2.0 之前,类别用于允许可选的委托(delegate)方法(具体来说,NSObject 上的类别,称为非正式协议(protocol))。
我的猜测是,iPhone SDK 中使用的大部分类别而不是协议(protocol)是从等效的 Mac 类中继承而来的。例如,NSURLConnection
存在于 Mac 和 iPhone SDK 中,因此代码很可能是共享的。由于 Apple 尚未更改所有 Mac 类以使用正式协议(protocol),因此我们留下了一些不一致的地方。
关于iphone - 为什么 iPhone SDK 对某些委托(delegate)使用类别而不是协议(protocol)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/900335/