为什么iPhone SDK会为某些代表使用类别而不是协议?

Dav*_*eck 9 iphone delegates protocols objective-c categories

我的理解是协议就像其他语言中的接口 - 它们声明了预期的方法 - 而类别允许您向现有类型添加新方法(甚至可能是您不拥有的类型).

那么,为什么iPhone SDK有时会使用类别来声明委托类型呢?通常我希望所有代表都是类型id <MyDelegateProtocol>但是有很多例子并非如此.

例如,请参阅NSURLConnection.它的委托类型为"id",而'contract'则在NSObject(NSURLConnectionDelegate)上声明为类别.

那么:在这些情况下使用类别的动机是什么?

Mat*_*all 13

Objective-C 2.0引入了@optional协议指令,允许您声明某些协议方法是可选的.在Obj-C 2.0之前,类别用于允许可选的委托方法(特别是NSObject上的类别,称为非正式协议).

我的猜测是,iPhone SDK中的大多数类别代替协议使用都是等效的Mac类的延续.例如,NSURLConnectionMac和iPhone SDK都存在,因此代码可能是共享的.由于Apple尚未完成将所有Mac类更改为使用正式协议,因此我们会留下一些不一致的地方.