我是一名初學者iOS/ObjectiveC編碼人員,並且試圖瞭解一些細節,而不是僅僅遵循我所看到的示例代碼。爲什麼在.h文件中使用前向聲明而不是#import?
我想我在.h文件中得到了一個前向聲明的要點:它告訴編譯器指定的類是「稍後定義的播放器」 - 然後將頭導入到.m文件中。
我不明白的是爲什麼不直接導入類頭在類引用,而不是使用預先聲明的標題?我對#import的理解是它不會多次導入標頭(就像#include - 這需要if_def的東西)。
難道我這一切都錯了嗎?
我是一名初學者iOS/ObjectiveC編碼人員,並且試圖瞭解一些細節,而不是僅僅遵循我所看到的示例代碼。爲什麼在.h文件中使用前向聲明而不是#import?
我想我在.h文件中得到了一個前向聲明的要點:它告訴編譯器指定的類是「稍後定義的播放器」 - 然後將頭導入到.m文件中。
我不明白的是爲什麼不直接導入類頭在類引用,而不是使用預先聲明的標題?我對#import的理解是它不會多次導入標頭(就像#include - 這需要if_def的東西)。
難道我這一切都錯了嗎?
使用前向引用的一個原因是編譯器速度。標題可能包含在許多其他文件中,這些文件可能不需要包含在頭文件中的定義。由於包含的文件是預處理程序包含的,因此包含很多包含文件或大量包含文件可以大大增加編譯器必須處理的代碼行數。
您可以通過在Xcode使用預處理命令來查看預處理器的輸出看到自己。通過在頭文件中轉發聲明類,您將刪除頭文件中包含的所有代碼。
我的用例是有循環引用的地方。例如,AppDelegate有一個ViewController實例的ivar,由於某種原因,ViewController也想引用AppDelegate(在.h中)。在這種情況下,我只在AppDelegate中使用#import
,並在ViewController中轉發聲明。否則,它不會編譯。
它用於最小化依賴關係。當你的項目變大時,你編譯每個文件的導入將會變成大量的依賴項,因爲一切都依賴於所有東西。這使得編譯過程慢得多,因爲它必須不必要地讀取和解析大量信息。
有一個關於用C向前行駛申報歷史問題的良好的書面記錄,並在它Why are forward declarations necessary?
長故事的子集短 - 這曾經是更大的問題時,內存是有限的。現在它不那麼重要,但可以幫助加速編譯大型項目。
的可能重複[@class與#進口(http://stackoverflow.com/questions/322597/class-vs-import) – vikingosegundo 2012-02-07 13:49:35
確定 - 感謝所有的答覆。所以這是一個編譯器優化 - 是有道理的 – 2012-02-07 14:01:42