我正在研究一些关于非正式协议和真实协议的基础知识。令我困惑的是,Cocoa似乎在NSObject上使用了很多非正式的协议。这些非正式协议是NSObject的类别,它声明方法,但实际上并没有实现它们。在NSObject上使用非正式协议或使用可选方法的协议有什么区别?
据我所知,他们使用非正式协议(换句话说,NSObject上没有提供方法实现的类别)的唯一原因是在Xcode中给出一个自动完成提示。
一个示例是NSNibLoading.h中定义的-awakeFromNib方法,NSNibLoading.h是NSObject上的非正式协议。笔尖加载系统在运行时检查对象是否实现该方法。如果是这样,那么它会调用它。
但现在让我们想象一下,没有任何功能称为非正式协议。另一种具有完全相同效果的替代方案将是一个真正的@protocol声明,它声明了一个可选方法-awakeFromNib。 NSObject只会采用该协议,编译器会愉快地提供自动完成。
任何人都可以指出这两种策略之间的巨大差异吗?我没有看到非正式协议的重点,但真的很想这样做。
什么样的建筑问题? – 2011-01-14 13:28:42
在某些情况下,您可能会使用库的混合,或者甚至自己编译一个库,而这些类别往往会出现问题。目前我还没有一个明确的例子,但是我知道,由于类别的原因,我们的项目中的three20框架导致了这些类型的问题。不是一个大粉丝。 – Jake 2011-01-25 11:42:34