2012-03-17 45 views
47

我已經開始了一個新的iOS 5項目,並注意到在每個.m文件.m文件中用於空的@interface聲明是什麼?

#import "HomeViewController.h" 

@interface HomeViewController() 

@end 

@implementation HomeViewController 
@synthesize ... 
  • 頂新的東西則需要此額外@interface ...如果我有一個單獨的.h文件中?
  • 爲什麼這不會出現在iOS 5之前的項目中?
  • 我可以使用它而不是單獨的.h文件嗎?
  • 今後的最佳做法是什麼?
+0

進行封裝。 – janusbalatbat 2012-03-17 15:14:20

+0

[在.h和.m文件中的@interface定義之間的區別]的可能的重複(http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m-file) – 2012-03-17 18:22:44

回答

79

這是一個class extension。您可以使用它來聲明您不希望位於.h文件中的聲明。

這是被許多開發者,甚至之前,誰手動添加在.m文件擴展名。所以我猜蘋果將這個包含在模板中,因爲它被廣泛使用,並被認爲是一種很好的做法。

事實上,.h文件應該只用來做那些打算從其他文件中使用的聲明。您可能需要聲明一些僅在.m文件中使用的屬性,方法或常量。對於這些聲明,最好在類擴展中進行。

因此,要回答你的問題:

  • 這是額外的@interface ...如果我有一個單獨的.h文件所需?

不,這不是必需的,但是是最佳實踐。

  • 爲什麼在iOS 5以前的項目中沒有顯示?

即使這是一種常用的做法,它並未包含在模板中。

  • 我可以用這個來代替單獨的.h文件嗎?

號的類擴展不會替換.h文件,你必須聲明「公共」類的接口。

  • 這個未來的最佳實踐是什麼?

你應該把在類擴展,不需要是.m文件的外部可見的所有聲明。

+0

感謝這樣一個徹底的答案!很高興看到蘋果在新模板中包含這一點,因爲這是大多數開發人員無論如何正在實施的最佳做法! – 2012-03-17 15:48:23

11

實現文件中的接口部分允許您聲明變量,屬性和私有方法,這意味着它們不會被其他類看到。

不,根本不需要。但我儘可能多地使用它,只公佈那些其他類需要看到的東西。

+2

私有的,因爲編譯器沒有在類的外部看到變量,屬性和方法,但是因爲我們正在使用Objective-C方法,所以任何人都可以調用任何東西都不是真正的私有... – 2012-03-17 15:39:24

+1

You are right,當然...我仍然會用C++來思考。 – 2012-03-17 19:52:12