2013-04-07 27 views

回答

7

這是關於@interface的內容的可見性。當它包含在頭文件中時,它可用於其他類查看它們何時導入頭文件。當它包含在實現文件中時,內容僅可用於該實現文件。典型地,當它在實現文件中被聲明時,它通過類擴展(即@interface ClassName()()表示類擴展/匿名類別)來完成,儘管如果需要可以使用命名的類別。

爲什麼這樣做有幾個原因。主要的是定義私有實例變量或屬性。您不希望這些內容暴露給導入頭文件的每個人,但您需要一個地方來存儲內部信息。例如,這將允許m_isActive將只執行中使用:

@interface Class() { 
    BOOL m_isActive; 
} 

您還可以覆蓋在頭文件中聲明只讀屬性,從而使實現文件使用圓點符號時,有它readwrite訪問。例如:

頁眉:

@interface Class 
@property (nonatomic, readonly) NSString* name; 
@end 

實現:

@interface Class() 
@property (nonatomic) NSString* name; 
@end 

@implementation Class 
... 
    self.name = @"WDUK"; // This is allowed, as the class extension has overridden the readonly attribute via a redeclaration of the property 
... 
@end 

另一種流行的用途是私下聲明你遵循特定的協議,這是一個實現細節並不需要是暴露在公共頭文件中。例如,當實現使用一個需要它作爲委託的對象時,並且您不想使用在該類之外不使用的協議來污染頭文件。

其他用途(在最近的LLVM/Clang改進中一直處於黑暗中)是定義私有方法。這不再是必需的,因爲編譯器會查找未在相應頭文件中聲明的方法,並且假定它們對於類是私有的並且自己聲明它們。

的重要組成部分,從所有這一切拿地,是頭文件(除非通過@private@protected定義有實例變量)內內@interface什麼是公開的,並且實現文件內的任何本質上是私有的。

+1

類擴展的另一個用途是私下聲明該類符合一個或多個協議。 – rmaddy 2013-04-07 02:18:03

+0

打我一拳,已經加入了!非常好的一點,但。 – WDUK 2013-04-07 02:21:37

+0

你們談論的這些協議是什麼? – 2013-04-07 02:29:40

2

頭文件中的一個定義了公共接口。

執行文件中的一個是類擴展,它擴展了公共接口和任何私有實現細節。

相關問題