2011-11-19 93 views
2

我只是不明白爲什麼有些人聲明.m文件中的方法。不能這些聲明只是在.h文件中?下面是我所看到的主要是:聲明.h文件和.m文件中指定@interface和@end的方法之間的區別

//myClass.h 

#import <UIKit/UIKit.h> 

@interface myClass: UIViewController 
{ 

} 

@end 

和執行(.M)部分:

//myClass.m 

#import "myClass.h" 

@interface myClass 

//declare some methods here 

@end 

@implementation myClass 

//the actual implementation 

@end 

有當方法被聲明爲這種方式有什麼區別?另外,「@private」方法可以在myClass.h中聲明,不是嗎?

+0

([在h和m文件@interface定義之間的差異]的可能重複http://stackoverflow.com/questions/3967187/difference-between-interface-definition-in-h-and-m-file ) –

回答

4

您發佈的代碼都不會編譯,也不等同於在頭文件中聲明方法。

頭部的目的是提供一組其他類可以導入的聲明。他們無法導入您的實施文件,因爲這會創建重複的定義。

正如bbum所說,你可能看到的是私有方法聲明在執行文件中。這些不打算在類之外使用,所以它們在實現文件中聲明。該功能被稱爲類擴展:

//MyClass.h 

#import <UIKit/UIKit.h> 

@interface MyClass: UIViewController 

// Declare methods that other classes should call here 

@end 

//MyClass.m 

#import "MyClass.h" 

@interface MyClass() // <--- NOTE THE PARENTHESES HERE 

// Declare methods that only this class should be using here 

@end 

@implementation MyClass 

// Define all your methods here 

@end 

不,你不能在頭宣佈「@private方法」,或其他任何地方。 Objective-C中沒有這樣的東西。 @private訪問說明符僅適用於變量。

+0

好的。謝謝你澄清... – Balaram

+0

優秀的答案..! –

2
  • MyClass而不是myClass;課程以大寫字母開頭。

如果該代碼編譯完成,我會感到驚訝。如果在.m中,你應該說:

@interface MyClass() 
@end 

然後,這將是一個類擴展,它已經在SO上討論了很多次。實際上,您正在爲MyClass聲明衝突的@interface,並且編譯器應該抱怨。

+0

嗯,類沒有開始,一頂帽子 - 這是標準的約定(應觀察到的),但不是由編譯器或任何其他的Xcode/iOS的組件執行。 –

+2

如果不以大寫字母開頭的類和你提交所述碼作爲編碼樣本到幾乎任何像樣的公司,他們會很可能不會僱傭你。你的選擇。 ;) – bbum

5

這是關於保持公共和私人界面之間的分離。

能夠在實現文件中聲明方法,屬性和iVar是一個明確的指示,你可以在類中做什麼和使用什麼以及類可以做什麼。

您也可以重新聲明屬性。例如:

在.H

@property (readonly, copy) NSString *aString; 

在.M

@property (readwrite, copy) NSString *aString; 
從類中

,所以你可以把屬性爲讀寫,但外部的屬性是隻讀。

0

我已經多次在.m文件中聲明內部類(與主類不同)。這些將是由.m包含的主類所使用的類(以及在.h中聲明的)。通過這種方式,內部類是「私人」的,此外,將它全部放在一個文件中,在處理主類實現時更容易閱讀和更新。

+0

建議;在聲明內部類時,爲類名添加一個'__'後綴。這使得它完全明顯,當一個內部類是參與回溯,等我用內部類所有的時間 - 非常有用 - 並且通常會使用一個類,而不是一個結構的,太。 – bbum

相關問題