美文网首页编写高质量代码的52个有效方法
52个有效方法(2) - 在类的头文件中尽量少引入其他头文件

52个有效方法(2) - 在类的头文件中尽量少引入其他头文件

作者: SkyMing一C | 来源:发表于2018-08-06 17:14 被阅读15次
    "头文件" 与 "实现文件"
    • Objective-C语言编写"类"的标注方式为: 以类名做文件名, 分别创建两个文件, 头文件后缀用.h, 实现文件后缀用.m。

    • #include#import的区别, #import具有防止重复引用的功能。在使用C语言时, 通常适用宏定义防止重复引用。

    @class ClassName 的使用
    • 在头文件中声明某个类的对象时, 需要告诉编译器此类存在, 但又不需要知道类的全部细节。此时可以使用 @class ClassName 告诉编译器。这叫做: “向前声明”。(如果你写的类继承自某个超类, 则必须引入定义那个超类的头文件)

    • 在实现文件中则需要引入类的头文件, 因为在实现文件中需要使用类的细节。

    • 注意: 将引入头文件的时机尽量延后, 只有在确有需要时才引入, 这样就可以减少类的使用者所引入头文件数量。以减少程序的编译时间。

    @class 和"循环引用"
    • 类A与类B,如果在各自头文件中引入对方的头文件,则会导致“循环引用”。当解析其中一个头文件时,编译器会发现它引入了另一个头文件,而那个头文件又回过头来引用第一个头文件。

    • 使用#import而非#include指令虽然不会导致死循环,但却意味着两个类里有一个无法被正确编译。

    • 使用@class可以避免这种"循环引用"的问题

    @class 和协议
    • 如果要声明某个类遵循一项协议, 那么该协议必须有完整定义, 且不能使用向前声明。

    • 向前声明只能告诉编译器有某个协议, 而此时编译器却要知道协议中定义的方法。

    • 这种情况下,尽量把“该类遵循某协议”的这条声明移至“class-continuation分类”中。

    • 如果不行的话,就把协议单独放到一个头文件中,然后将其引入。

    要点:
    1. 除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明(就是@class obj)来提及别的类,并在实现文件中引入那些类的头文件。这样可以尽量降低类之间的耦合(coupling) (在.h文件中使用@class obj来声明,在.m文件中再使用#import来引入头文件)

    2. 有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量把“该类遵循某协议”的这条声明移至“class-continuation分类”中。如果不行的话,就把协议单独放到一个头文件中,然后将其引入

    相关文章

      网友评论

        本文标题:52个有效方法(2) - 在类的头文件中尽量少引入其他头文件

        本文链接:https://www.haomeiwen.com/subject/gskgvftx.html