2

想象一下,您想声明一个新协议并通过在“基”类上实现其方法来为其定义默认行为。如果您不拥有此类的实现文件(例如 NSObject),您可能希望通过类别来实现协议的方法。这可能会导致您看到类似于以下代码的内容:

    /* * * * * * * * * * * * * * * * * * * * * * * * *
    *      Formal Protocol
    * * * * * * * * * * * * * * * * * * * * * * * * */

    @protocol MyProto <NSObject>

    - (void) myMethod;

    @end



   /* * * * * * * * * * * * * * * * * * * * * * * * *
    *      Informal Protocol (a Category Interface)
    * * * * * * * * * * * * * * * * * * * * * * * * */

    @interface NSObject (MyProto)
        <MyProto>
    @end



   /* * * * * * * * * * * * * * * * * * * * * * * * *
    *      Category Implementation
    * * * * * * * * * * * * * * * * * * * * * * * * */

    @implementation NSObject (MyProto)

    - (void) myMethod {
        return;
    }

它无法正确编译,并在行周围产生几个警告

@implementation NSObject (MyProto)

(语义问题)

  • 协议中的方法未实现
    • 此处声明的方法
    • 直接或间接协议“NSObject”需要

要抑制这些警告,只需在协议声明中删除对 NSObject 协议的提及

    @protocol MyProto

    - (void) myMethod;

    @end

这将防止链接器在您的类别实现中重新要求 NSObject 协议的方法。

4

0 回答 0