Objective c 协议中的目标c init

Objective c 协议中的目标c init,objective-c,protocols,init,Objective C,Protocols,Init,昨天,一位同事问,为什么不在协议中声明init方法(initWith…:(…),以强制实现类提供这样的初始值设定项。我对这个问题感到非常惊讶,据我理解,这是胡说八道。但我找不到确切的原因,但在协议中声明init方法会降低实现的灵活性 你能告诉我一个很好的理由吗,为什么协议中应该或者不应该有init方法 谢谢 我知道iOS SDK中的一些协议具有初始化。。。方法。例如,NSCoding协议具有–initWithCoder:必选方法。我认为这是正常的做法。您在协议中定义方法,以便您的代码可以调用其他

昨天,一位同事问,为什么不在协议中声明init方法(initWith…:(…),以强制实现类提供这样的初始值设定项。我对这个问题感到非常惊讶,据我理解,这是胡说八道。但我找不到确切的原因,但在协议中声明init方法会降低实现的灵活性

你能告诉我一个很好的理由吗,为什么协议中应该或者不应该有init方法


谢谢

我知道iOS SDK中的一些协议具有初始化。。。方法。例如,NSCoding协议具有–initWithCoder:必选方法。我认为这是正常的做法。

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

  • 您定义协议
  • 其他人执行您的协议
  • 其他人创建一个实现您的协议的对象,并将其提供给您,因此
  • 您可以调用协议的方法,而不知道它们的实现
为了调用协议的方法,您需要有一个实现它的对象实例。定义协议的全部要点是从代码中删除关于实现协议的类的任何知识:如果您知道将获得哪个类,那么您最好跳过协议,直接对该类进行编程。但是,如果要调用
init
,您必须知道该类,或者其他人必须向您传递一个
alloc
-ed对象,该对象上尚未调用
init
。这两种选择都不是一个好主意——第一种选择扼杀了拥有协议的目的,第二种选择迫使调用者处理部分初始化的对象


请注意,这并不妨碍您在协议中使用非
init
配置方法:如果必须使用某些信息位配置所有对象,请让您的用户实现他们想要的
init
,并向协议中添加
configureWith:…
方法,允许您在不知道对象的
init
方法的情况下控制对象的配置过程。

这是否是一种正常做法,如果不是其他人创建了实现接口的对象,而是您?@SeriousBob如果您创建了对象,那么您就知道它的类型以及它实现的所有协议。在这种情况下,知道
init
(或就此而言,任何其他方法)是协议的一部分不再是必要的。好吧,那么为什么NSCoding协议有initWithCoder:method?@SeriousBob
NSCoding
是一种非常特殊的情况:它被设计为支持归档(在其他框架中也称为“序列化”)因此它在协议中定义了一个
init
方法。通过一些反射魔法创建实例,然后调用
initWithCoder:
。其他语言的框架需要可序列化类来提供无参数构造函数。正如我所想的,谢谢你的详细回答。这对我来说意味着,协议中的init声明(如果“某些反射魔法”没有使用的话)是无稽之谈,违反了任何一种约定,对吗?你好,鲍勃