2012-11-29 111 views
1

我知道在.m和.m中輸入一個前向類聲明(@class ClassA)是正確的做法。而且我也知道這樣做可以讓編譯器稍後編譯它(直到#將它導入到.m中)。關於@class的正向類聲明

通常我們在A.h中使用@class ClassA,同時在A.m中添加#import ClassA.h,儘管編譯器在A.h中不編譯ClassA,但編譯器仍然需要在A.m.中編譯它。 那麼爲什麼不直接在A.h中使用#import呢?

+0

http://stackoverflow.com/questions/9177265/why-use-forward-declaration-rather-than-import-in-h-file?rq=1 – ohho

回答

2

在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東西存在「

0

我使用@class而不是#import in .h原因有兩個:

  1. 使循環依賴關係成爲可能。

  2. 減少編譯時間。

我通常發現有相互鏈接,A-> B和B-> A,這是不可能的,沒有前向聲明是有用的。