我的理解是,协议是像其他语言界面 - 他们宣称有望方法 - (你没有自己甚至类型),而类别允许你添加新的方法,以现有的各类

那么,为什么不iPhone的SDK有时使用用于声明委托类型类别?通常情况下我希望各位代表要输入ID 但也有许多例子不是这种情况。

例如,参见NSURLConnection的。其代表被键入“ID”和“契约”被声明为上NSObject的(NSURLConnectionDelegate)的类别。

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

有帮助吗?

解决方案

目标-C 2.0引入的@optional协议指令,允许你声明某些协议方法是可选的。在此之前的OBJ-C 2.0,类别被用来允许可选委托方法(具体地,上NSObject的,这是所谓的非正式协议类别)。

我的猜测是,大多数在iPhone SDK的类别-代替-的协议使用的是从等效MAC类故障保持。例如,NSURLConnection中都存在的Mac和iPhone的SDK,所以代码很可能共享。由于苹果尚未经历过改变所有的Mac类使用正式的协议,我们留下了一定程度上的不一致。

其他提示

直到目标C的修订被移开与OS X 10.5和iPhone SDK,被称为“目标C 2.0”,人们只能通过使用类别使可选协议。在Objective-C 2.0,在协议来标记该方法是可选的(剩余部分被隐式地需要)。

的溶液中加入一个新关键字@optional

所以我认为你看到的是一个轻微的保持了从早期的天@optional关键字之前。

编辑:要回答的后续出现于原来的问题:使用上NSObject的/ ID为非正式协议类别的动机是部分地记录和组什么方法的对象可以在其数据源调用(或代表或其他),并在较小程度上避免你调用编译器不知道会出现在接收调用对象的方法编译器警告。想象一下,一个要实现哪些调用这些数据源方法的类 - 你可能会想检查的方法,使用存在[OBJ respondsToSelector:@selector(我:数据源:方法:)]只要你有兴趣在呼叫我:数据源:方法:在对象物obj方法

这是一个传统的从目标c 1.0,它没有“可选协议方法”来了。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top