Objective-C的跨文件依賴關係

0x01 什麼是依賴關係

依賴關係是兩個實體之間的一種關係。

依賴關係可以存在於兩個類之間,也可以存在於兩個或多個文件之間。兩者之間任何一個發生變化,都需要重新編譯相關的文件來適應變化。

導入頭文件使頭文件和源文件之間建立了依賴關係。由於依賴關係是傳遞的,頭文件之間也可能互相依賴,所以如果某個頭文件發生變化,可能一系列的文件都將需要重新編譯,這將使編譯時間大大加長,影響編譯效率。

 

0x02 依賴關係導致負面影響的原因

導致依賴關係問題的原因是Objective-C編譯器需要知道某些信息才能工作。

有時候編譯器需要知道類的全部信息,例如它的實例變量配置、它所繼承的所有類等,而有的時候,編譯器只需要知道類名即可,不需要了解整個定義。


0x03 減少依賴關係負面影響的方法

Objective-C提供了一個方法, 能夠減少由依賴關係引起的重新編譯帶來的負面影響。

Objective-C引入了關鍵字@class來告訴編譯器:“這是一個類,所以我只會通過指針來引用它。”這樣編譯器就不必知道關於這個類的更多信息,只要瞭解它是通過指針來引用的即可。

仔細觀察此前帖子中的Car類接口,我們可以看到它通過指針引用了Tire和Engine,所以這裏可以用@class代替#import語句:

#import <Cocoa/Cocoa.h>

@class Tire;
@class Engine;

@interface Car : NSObject

- (void) setEngine: (Engine *) newEngine;
- (Engine *) engine;

- (void) setTire: (Tire *) tire
         atIndex: (int) index;
- (Tire *) tireAtIndex: (int) index;

- (void) print;

@end // Car

@class創建了一個前向引用。

如果有循環依賴關係,即A類使用B類,B類使用A類,此時通過#import語句讓這兩個類互相引用,將會出現編譯錯誤。而在A類中使用@class B,在B類中使用@class A,如此互相引用是可以的。

 

0x04 導入和繼承

回顧之前我們創建的Slant6類和AllWeatherRadial類,分別繼承自Engine類和Tire類。

由於它們是繼承自其它類而不是通過指針指向其它類的,所以在頭文件裏不能使用@class語句。

因爲編譯器需要先知道所有關於超類的信息才能成功地爲其子類編譯@interface部分。

所以Slant6.h仍然如下所示:

#import "Engine.h"
@interface Slant6 : Engine
@end // Slant6

Slant6.h中沒有#import <Cocoa/Cocoa.h>,因爲在其超類Engine.h中已經導入過了。

但是在該文件里加上#import <Cocoa/Cocoa.h>也沒有問題,因爲#import命令不會重複導入已經被導入的文件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章