我一直在阅读Objective-c Protocols and Categories,这对我来说似乎毫无意义。它们都用于以一些有趣的方式向程序添加内容,而不仅仅是手动添加它。
我可能会确信协议的目的是为了让你可以检查id的类型,但这确实是关于它的。我认为没有其他真正的用途。
至于类别,我真的不明白你为什么不把它们添加到代码中。为什么你需要手动指定一个类别中的方法,而不是只是正常地执行它?您是否想要制作一个“子类”但稍作修改?为什么不做一个子类?
我真的没有看到其中任何一个的目的,我希望有人可以告诉我他们真正的用途= /
提前致谢, 基督教
答案 0 :(得分:15)
类别是将方法添加到源不可用的类,例如所有Apple类(以NS,CG,CA等开头的类),而不需要对它们进行子类化。
协议的目的是定义遵守该协议的类必须实现的方法。在Java中,那些被称为接口。目的是编纂不是兄弟姐妹的类(同一超类的子类)之间的相似性。假设您有一个班级Chair
和一个班级Petrol
。除了它们都遵循flammable
协议,这要求他们使用某些方法,例如specificEnergy
和flamingPoint
时,这些协议没有太多共同点。
现在,您的Fire
课程可以使用方法addFlammableMaterial:(id <flammable>)material
。
协议通常用于声明某些类的实例可以是某些其他实例的委托。您可以声明视图控制器作为UITableView
的数据源,声明它符合UITableViewDataSource
协议,这意味着您的viewController保证它实现该协议所需的方法,并且tableView可以安全地休息,因为它可以信任VC作为它的数据源。
答案 1 :(得分:4)
类别是一种向现有类的所有实例添加新方法而无需修改类本身的方法。
对于类别阅读已经讨论过的SO帖子,
What is the difference between inheritance and Categories in Objective-C
经常使用协议来指定委托对象的接口。
协议声明可以由任何类实现的方法。协议在至少三种情况下都很有用:
To declare methods that others are expected to implement
To declare the interface to an object while concealing its class
To capture similarities among classes that are not hierarchically related
答案 2 :(得分:2)
协议的工作方式类似于Java中的接口。您可以使用某些方法定义协议,然后在许多类中实现它。这些类中的每一个都可以具有协议提供的方法的不同实现,但是接口将是相同的。例如:您想要计算不同类型员工的薪水,例如。 FullTimeEmployee
和ContractEmployee
。您可以将calculateSalary
方法定义放在协议中,并在这两个类中提供不同的实现,例如。一个人会返还固定工资,而另一个人会根据工作时间返还工资。然后,您可以将每个类实例转换为协议类型,并调用给定方法接收适当的结果。
如果你想扩展一个不属于你的类,那么类别很有用,比如内置类,ex。 NSString
。您可以添加reverse
之类的方法来获取反向字符串。为什么不做一个子类?因为您可以在修改后的类上调用自定义方法,而无需对类型进行强制引用。
答案 3 :(得分:2)
协议是一种将代码契约应用于类的方法,其方式与Java和C#中的接口相同。
类别对于扩展无法直接修改的类很有用,它们与C#中的扩展方法非常相似。
答案 4 :(得分:1)
类别可用于向现有类添加功能,例如所有NS ...类。您无法直接向这些代码添加代码。
当您在协议中调用方法时,协议用于指定某个类实际执行某些操作。