协议中的objective c init

时间:2013-05-29 09:18:21

标签: objective-c protocols init

昨天一位同事问,为什么我们不应该在协议中声明一个init方法(initWith ...:(...))来强制实现类来提供这样的初始化器。我对这个问题感到非常惊讶,根据我的理解,这是无稽之谈。但我找不到明确的理由,但在协议中声明init方法会导致实现的灵活性降低。

请您告诉我一个很好的理由,为什么协议中应该或不应该使用init方法?

谢谢!

2 个答案:

答案 0 :(得分:7)

您可以在协议中定义方法,以便您的代码可以调用其他人实现的方法。您和实现协议的开发人员之间的“契约”如下所示:

  • 定义协议
  • 其他人实施您的协议,
  • 其他人会创建一个实现协议的对象,并将其提供给您,所以
  • 可以在不知道其实施的情况下调用协议的方法。

为了调用协议的方法,您需要有一个实现它的对象的实例。定义协议的重点是从代码中删除有关实现协议的类的任何知识:如果你知道要获得哪个类,你可以跳过协议,直接编程到类。但是,如果您想要调用init,则必须要知道该类,否则其他人必须向您传递alloc对象,其中尚未调用init 。这两种方法都不是一个好主意 - 第一个是杀死协议的目的,第二个是强制你的调用者处理部分初始化的对象。

请注意,它不会阻止您在协议中使用非init配置方法:如果必须使用某些信息配置所有对象,请让您的用户实现他们想要的任何init ,并在协议中添加configureWith:...方法,让您可以控制配置对象的过程,而无需了解其init方法。

答案 1 :(得分:4)

我知道iOS SDK中有一些具有init ...方法的协议。例如,NSCoding Protocol具有 - initWithCoder:required方法。我认为这是正常的做法。