协议中的objective c init

Ser*_*Bob 7 protocols objective-c init

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

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

谢谢!

das*_*ght 7

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

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

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

请注意,它不会阻止您init在协议中使用非配置方法:如果必须使用某些信息配置所有对象,请让您的用户实现init他们想要的任何内容,并configureWith:...为您的协议添加方法,让您控制在不知道其init方法的情况下配置对象的过程.


sto*_*sha 5

我知道 iOS SDK 中的一些协议有 init... 方法。例如 NSCoding Protocol 有 \xe2\x80\x93 initWithCoder: 必需的方法。我认为这是正常做法。

\n