我试图了解Apple框架中没有代理的协议的高级实现。当subClass符合并实现协议方法时,该方法如何调用?让我们考虑一下NSCoder协议方法(encodeWithCoder:和initWithCoder :)。
如果没有代理,您能否为协议提供任何用例(除了实现多态性之外?我看到一些方法可以从基类中抽象出来并分组到一个接口但没有任何实现(例如mixins),什么是重要的用途?
答案 0 :(得分:3)
首先,协议方法没有任何特殊之处。与其他所有Objective-C方法一样,它们会被发送给对象的消息调用。这部分事情并没有什么特别之处。协议基本上只是编译器的一个提示,尽管你可以在运行时查询一个对象是否符合一个对象并根据它做出决定。
您可以通过实现协议方法(或整个协议)来验证这一点,而无需在类的接口中声明该事实,并在将该对象的实例转换为id<YourProtocol>
后调用该对象的实例,并且它会工作。
您可以(有时应该)自己调用NSCoding
方法 - 您可能决定要将对象持久保存到磁盘,这是执行此操作的最佳方法。
NSCoding
实际上是一个很好的例子,说明为什么协议仍然有用,即使它们没有提供任何实现 - initWithCoder:
和encodeWithCoder:
的实现对于每个类都是不同的实现它们 - 提供实现没有任何意义。
在此基础上,考虑datasource
的{{1}}属性;因为Objective-C中没有多重继承,所以数据源本身就不是一个类,因为这会阻止你使用UICollectionView
作为数据源,并迫使你做一个全新的这个目的的课程。
Protocols can also be used to implement multiple inheritance in a type safe way without redeclaring the interface of the giver in the inheritor.如果继承的类的整个接口是一个协议,那么继承者也可以简单地符合该协议。
Objective-C确实提供了类别形式的mixins,它可以在现有类上实现协议。
对于协议的全面防御(在Swift中),请参阅面向协议的WWWDC 2015演讲。
答案 1 :(得分:0)
以NSCoding协议为例,协议中的两个必需方法基本上实现了一个对象应该执行的步骤,以便对自身进行编码以进行存档。它还实现了initWithCoder,以便从存档中重新创建对象。
假设您创建了一个自定义对象,只有您的对象知道需要归档的属性。
当您调用一个方法来存档您的自定义对象时,方法调用最终会流向您的encodeWithCoder或initWithCoder以采取特定于您的类的操作。
*****更新了****
用一个例子来看这个: 可以说我们的数据结构看起来像这样
someArray = [String,CustomObject,aDictionary]
当我们要存档someArray时,我们在其上调用archiveRootObject方法。现在为了让someArray自行存档,它需要所有包含的项目来自行存档。数组只是简单地指示子项归档,并在其上调用encodeWithCoder方法。
通过采用并符合NSCoding协议,您只需向根数组确认是,我知道如何归档和取消归档自己。
希望这有帮助。