也许 你 从各种渠道 听说过 非正式协议这个概念。非正式协议 实际上 指的是 一个类别。这个类别当中 列举了 一系列的措施,而 这些措施 并没有包含 具体内容。大家 都 知道 所有类型的物件 都 包含 在最底层那类物件当中,所以 非正式协议 是 为最底层那类物件制定的,这样 所有类型的物件 都可以遵循。因此 非正式协议 又称为 抽象协议。
如果 你 查看 <NSScriptWhoseTests.h>这个头文件,你 就能找到 这样的非正式协议:
这里的NSComparisonMethods这个类别 就属于 NSObject这类物件。这里面的措施 可以当作 协议的一部分 加以实施。一类物件的非正式协议 并不包含 每项措施的具体内容,而 包含在这类物件中的另外一类物件 则需要 在它们的接口部分 列举出 这些措施,并且 在实施部分 写出 这些措施的具体内容。与 正式协议 不同,编译器 并不强制要求 你 实施 非正式协议中的措施。
如果 一类物件 遵循 一项正式协议,那么 这项协议中所有必要的措施 都必须 适用于 这类物件。如果 一类物件 遵循 一项非正式协议,这项协议中的措施 并不一定要 全部 适用于 这类物件。编译器 也不会检查 一类物件 是否遵循 非正式协议,但是 运行系统 会检查 这一点。
先前的博文中提到的@optional命令 和 非正式协议的作用 是 一样的。