2012-07-21 27 views
29

我想知道爲什麼會有@interface兩次。一個在class.h和其他class.m。例如:爲什麼在@implementation上面有@interface?

TestTableViewController.h

#import <UIKit/UIKit.h> 

@interface TestTableViewController : UITableViewController 

@end 

和(自動生成)class.m我發現:

#import "TestTableViewController.h" 

@interface TestTableViewController() 

@end 

@implementation TestTableViewController 

... methods delegated from UITable delegates 

@end 

所以我的問題是,什麼在.m文件@interface TestTableViewController()左右。爲什麼它在那裏?我需要它嗎?

在此先感謝

+0

[在.h和.m文件中的\ @interface定義之間的差異]的可能重複(http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m-文件),[用於iOS 5項目的.m文件中的\ @接口聲明是什麼?](http://stackoverflow.com/questions/9751057/what-is-the-interface-declaration-in-m-文件用於在ios 5項目),[兩個接口在* .h和* .m文件](http://stackoverflow.com/questions/9590917)[聲明接口內的實現文件(Objective- C)](http://stackoverflow.com/questions/10647913/) – 2012-07-21 17:54:12

回答

46

第二個@interface指令位於實現文件(.m)中 - 您可以從中推斷出它意味着聲明該類的創建者不想向該類的用戶公開這些內容。這通常意味着私人和/或內部方法和屬性。另請注意,有兩種類型的操作。在一個(你在這裏看到的)被稱爲「類擴展」和它是由一對空括號表示:

@interface MyClass() 

這一個是particularily重要,因爲你可以用它來增加額外的實例變量類。

第二個,稱爲「類別」,是由非空對括號指示的,包圍所述類別的名稱,例如:

@interface MyClass (CategoryName) 

和它也用於擴展類。您不能使用類別將實例變量添加到類中,但您可以爲同一個類使用多個類別,這就是爲什麼它主要用於擴展沒有源代碼的系統/框架類的原因 - 所以從這個意義上說,一個類別與類擴展完全相反。

2

在那裏,你可以聲明私有方法和屬性,你只需要在你的類中使用,但不暴露給其他類。

3

第二個「接口」定義爲「TestTableViewController」級,這是不以人誰只導入.h文件可見的擴展。這是在客觀C.

+0

不,它不是一個類別,它是一個類擴展。 -1。 – 2012-07-21 17:50:52

+1

對-1不太好..類別和擴展之間的區別主要是語義上的:擴展基本上是一個匿名類別,要求它在類的主要實現塊中實現。因此,在第二個「接口」塊的括號中設置一個名稱,將有效地創建一個類別,而不是擴展名... – dcoder 2012-07-22 12:10:24

2

創建私有方法的TestTableViewController.h文件中的接口是一類擴展的聲明事實上的方式。有兩個圓括號表明這一點。語法與爲類編寫類別相同。但在這種情況下,它用來聲明某種私有方法的作者不希望在頭文件

正常類接口看起來像這樣揭露:

@interface TestTableViewController (Your_Category_Name) 
- (void)doSomething; 
@end 

以及相應的實施:

@implementation TestTableViewController (Your_Category_Name) 
-(void)doSomething { 
// Does something... 
} 
@end 

在您的例子沒有指定類別名稱,所以它只是擴展了類,並可以實現在正常的執行方法。

通常這種技術被用於「隱藏」的方法。它們沒有在頭文件中聲明,並且只在導入.h文件時才顯示。

+0

正在使用的類別除了聲明私有方法和分類代碼外,還有其他用途? – 2012-07-21 17:45:11

+0

謝謝你告訴我。我現在沒有把這稱爲類擴展。我直到現在纔想到它是一個類別。我會修好它。 – 2012-07-21 17:50:53

+0

即使沒有名字,仍然沒有擴展類?我們如何添加實例變量? – Honey 2016-03-28 20:33:08

相關問題