"头文件" 与 "实现文件"
-
Objective-C语言编写"类"的标注方式为: 以类名做文件名, 分别创建两个文件, 头文件后缀用.h, 实现文件后缀用.m。
-
#include
和#import
的区别,#import
具有防止重复引用的功能。在使用C语言时, 通常适用宏定义防止重复引用。
@class ClassName 的使用
-
在头文件中声明某个类的对象时, 需要告诉编译器此类存在, 但又不需要知道类的全部细节。此时可以使用
@class ClassName
告诉编译器。这叫做: “向前声明”。(如果你写的类继承自某个超类, 则必须引入定义那个超类的头文件) -
在实现文件中则需要引入类的头文件, 因为在实现文件中需要使用类的细节。
-
注意: 将引入头文件的时机尽量延后, 只有在确有需要时才引入, 这样就可以减少类的使用者所引入头文件数量。以减少程序的编译时间。
@class 和"循环引用"
-
类A与类B,如果在各自头文件中引入对方的头文件,则会导致“循环引用”。当解析其中一个头文件时,编译器会发现它引入了另一个头文件,而那个头文件又回过头来引用第一个头文件。
-
使用#import而非#include指令虽然不会导致死循环,但却意味着两个类里有一个无法被正确编译。
-
使用@class可以避免这种"循环引用"的问题
@class 和协议
-
如果要声明某个类遵循一项协议, 那么该协议必须有完整定义, 且不能使用向前声明。
-
向前声明只能告诉编译器有某个协议, 而此时编译器却要知道协议中定义的方法。
-
这种情况下,尽量把“该类遵循某协议”的这条声明移至“class-continuation分类”中。
-
如果不行的话,就把协议单独放到一个头文件中,然后将其引入。
要点:
-
除非确有必要,否则不要引入头文件。一般来说,应在某个类的头文件中使用向前声明(就是@class obj)来提及别的类,并在实现文件中引入那些类的头文件。这样可以尽量降低类之间的耦合(coupling) (在.h文件中使用@class obj来声明,在.m文件中再使用#import来引入头文件)
-
有时无法使用向前声明,比如要声明某个类遵循一项协议。这种情况下,尽量把“该类遵循某协议”的这条声明移至“class-continuation分类”中。如果不行的话,就把协议单独放到一个头文件中,然后将其引入。
网友评论