我正在研究有关非正式协议和真实协议的一些基础知识.令我困惑的是,Cocoa似乎在NSObject上使用了很多非正式协议.那些非正式协议是NSObject上的类别,它们声明了方法,但实际上并没有实现它们.
就我说得对,他们使用非正式协议(换句话说,NSObject上不提供方法实现的类别)的唯一原因是在Xcode中给出自动完成提示.
一个例子是NSNibLoading.h中定义的-awakeFromNib方法,它是NSObject上的一个非正式协议. nib加载系统在运行时检查对象是否实现了该方法.如果是,则调用它.
但现在让我们想象一下,没有一种称为非正式协议的功能.具有完全相同效果的替代方案将是一个真正的@protocol声明,它声明了一个可选方法-awakeFromNib. NSObject只会采用该协议,编译器会很乐意提供自动完成功能.
谁能指出这两种策略之间的巨大差异?我没有看到非正式协议的意义,但我真的很想这样做.