2016-02-14 105 views

回答

1

的(也許簡體)版本是這樣的:

如果導入頭/接口文件,它像包括在那個地方整個其他文件。因此,通常您的所有接口代碼在該位置都是已知的。當你使用某些類/對象時,編譯器需要知道它們是什麼以及它們是如何被精確調用的:這些方法需要什麼參數/參數,這些方法返回什麼?要回答這些問題,頭文件通常包含在implmentation(.m)文件中。

作爲實施進口其自己的頭文件,你可以經常把其他進口就在那裏。但是什麼時候需要在頭文件中導入?當你聲明你的界面時,你經常提到其他類型/類,即你說@proerty (strong) SomeClass *element;。現在編譯器需要知道關於SomeClass的,但不是全部。如果編譯器知道它是另一個類,那麼在這次可以確定。在頭文件中,不需要更多信息,因此@class SomeClass的「前向聲明」就足夠了。導入其他類的完整頭文件也適用。

那麼,進口的下滑?主要有兩個參數:編譯時間和導入週期。考慮一個小例子 - 每當SomeClass.h發生變化時,包含它的所有內容都必須重新編譯。這很容易通過完整的代碼級聯。此外,很明顯,即進口頭文件的任何代碼將導入所有的進口等。週期參數是這樣工作的。 A.h進口B.h,B.h進口A.h.根據什麼在他們,應該在另一個之前被稱爲...

(我想提一提的是,問題是多一點輕鬆與最新的編譯器,但基本的論證仍然成立)。

一些更多的注意事項:當你宣佈相互關聯的兩種可能需要的@class向前聲明,即使用一些類聲明只是之下的協議:

@class SomeClass; 

@protocol SomeProtocol 
-(void)doSomethingWith:(SomeClass *)object; 
@end; 

@interface SomeClass 
@end 

向前聲明沒有按不適用於類實現的協議或父類。

+0

非常感謝您的回答!你能談談這個問題中編譯和運行的區別嗎? –

+0

這是關於源代碼和編譯。它根本不會對正在運行的程序產生任何影響。 – Eiko

相關問題