我知道在.m和.m中輸入一個前向類聲明(@class ClassA)是正確的做法。而且我也知道這樣做可以讓編譯器稍後編譯它(直到#將它導入到.m中)。關於@class的正向類聲明
通常我們在A.h中使用@class ClassA,同時在A.m中添加#import ClassA.h,儘管編譯器在A.h中不編譯ClassA,但編譯器仍然需要在A.m.中編譯它。 那麼爲什麼不直接在A.h中使用#import呢?
我知道在.m和.m中輸入一個前向類聲明(@class ClassA)是正確的做法。而且我也知道這樣做可以讓編譯器稍後編譯它(直到#將它導入到.m中)。關於@class的正向類聲明
通常我們在A.h中使用@class ClassA,同時在A.m中添加#import ClassA.h,儘管編譯器在A.h中不編譯ClassA,但編譯器仍然需要在A.m.中編譯它。 那麼爲什麼不直接在A.h中使用#import呢?
在A.h.中幾乎從不使用@Class A
。通常的做法是在B.h.中使用A.h和@Class A
中的@Class B
。這是爲了避免.h文件中的循環依賴。如果A.h導入B.h和B.h導入A.h,編譯器將從循環依賴中爆炸。
你最後一句話似乎是問爲什麼我們從不在A.h.中輸入A.h。我認爲這很明顯,爲什麼沒有完成。
請記住,頭文件(.h)旨在告訴世界關於您的聲明的最小可能性。它告訴編譯器 - 「嗨,我們有一個包含一些方法和屬性的類(@interface),並且這些方法使用這些其他的類。我們對其他類使用@class,因爲在這個時候,我們只需要知道最終會有這樣的類,這足以讓編譯器很高興,因此它可以完成它的工作,最終,鏈接器會對這些類是否真的存在做出最終決定
源文件(.m )需要進行實際的導入,因爲編譯器需要驗證是否真的有你正在使用的方法和屬性,但頭文件不調用方法,也不調用屬性,它只是聲明 - 「This東西存在「
我使用@class而不是#import in .h原因有兩個:
使循環依賴關係成爲可能。
減少編譯時間。
我通常發現有相互鏈接,A-> B和B-> A,這是不可能的,沒有前向聲明是有用的。
http://stackoverflow.com/questions/9177265/why-use-forward-declaration-rather-than-import-in-h-file?rq=1 – ohho