1. 程式人生 > >iOS---Objective-C中@class與#import的區別

iOS---Objective-C中@class與#import的區別

在Objective-C的專案中, @class通常放在.h檔案中, 主要作用在於提升編譯效能, 且能防止標頭檔案的遞迴import.

編譯效能的考慮

通常, 使用#import引入一個類的標頭檔案, 編譯時會將該類的標頭檔案中的所有資訊都引入, 包含屬性和方法, 但有時候卻不需要這麼多, 且包含這些資訊會降低編譯效能.
而@class就表示這只是一個類而已, 我們所關心的僅此一點, 而不需要知道該類的內部有哪些屬性和方法. 這種情況下, 我們在.h標頭檔案中就可以僅僅使用@class, 以提升編譯效能. 而在.m實現檔案中, 往往就需要知道類的內部資訊了, 這時就需使用#import來引入這些資訊.
在AFNetworking原始碼中, 能夠看到非常多類似的情景. 如UIButton+AFNetworking.h:

// UIButton+AFNetworking.h
@class AFImageDownloader;

@interface UIButton (AFNetworking)

+ (void)setSharedImageDownloader:(AFImageDownloader *)imageDownloader;

+ (AFImageDownloader *)sharedImageDownloader;

在其.m實現檔案中:

// UIButton+AFNetworking.m

#import "AFImageDownloader.h"

關於編譯效能, 還有一點需要補充: 若類檔案依次使用#import來引用, 則最開始的標頭檔案有變化, 則後續所有引用它的類都需要重新編譯.
而@class則不會有這個問題.

import會導致遞迴引用

另外, 以#import的方式引入一個類, 有可能造成兩個類之間相互引入對方的標頭檔案, 造成遞迴引用. 這一點目前在xcode中不會再報錯誤了, 但依然是存在的.

include可能導致重複引入

#import能夠保證標頭檔案只被引入一次, 而#include則可能會出現重複引入.