在.h檔案和.m檔案裡使用import指令有何區別?
有的程式設計師喜歡把所有import語句寫在.h檔案的頭部。而有的程式設計師則喜歡把import語句寫在.m檔案頭部。
你可能覺得寫在哪裡都無所謂。
那麼,import語句寫在.h檔案和.m檔案的哪一個都無所謂嗎?
這並不是真的。
通常,我習慣在.h檔案頭部加入所有的import語句,但在有一種情況下,我只能把import語句加在.m檔案裡——這是為了避免交叉引用錯誤。
因此我建議你像我一樣,平時可以將import語句都放在.h檔案裡,當編譯器告訴你找不到某個類的宣告但你明明已經匯入了這個類的標頭檔案時,把import語句移到.m檔案頭部。
這是GCC編譯器的一個Bug,與Xcode4.2或者3.2無關。在Xcode的任何版本都會報這個錯誤。
你有一個類A:
#import <Foundation/Foundation.h>
#import "B.h"
@interface A : NSObject
@end
#import "A.h"
@implementation A
@end
還有一個類B:
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : NSObject
@end
#import "B.h"
@implementation B
@end
然後你決定從A繼承一個類,子類C:
#import "A.h"
@interface C : A
@end
#import "C.h"
@implementation C
@end
一切,OK,編譯通過。然後你決定讓B也繼承A:
#import <Foundation/Foundation.h>
#import "A.h"
@interface B : A
@end
這時候問題來了,編譯器告訴你“can not find interface of declaration for ‘A’,superclass of ‘B’”。
怎麼可能?B中明明import了A.h,而且通過command鍵+滑鼠左鍵,也可以從B中找到A的介面宣告。你嘗試了各種方法,就是找不到問題出在哪裡。而且C同樣是A的子類,C和B除了類名外,程式碼沒有任何不同。難道Cocoa限制了一個類的子類數量?一個子類可以繼承,第2個就不行?
不用大驚失色。問題在於A中import了B.h,而B又引用了A,這就構成了交叉引用。不過編譯器卻給出了一個讓人混淆不清的提示“找不到父類介面”。