2011-10-30 67 views
7

聲明變量,我看到一本書展示這個代碼的例子:在@implementation

@implementation ViewController 
{ 
    NSString *name; 
} 

爲什麼不@interface申報呢?在@implementation中聲明變量有什麼區別,而不是@interface?爲什麼要在此範圍內聲明NSString

回答

8

@implementation部分聲明ivars的優點是更好的封裝。這樣,ivars不必出現在.h文件中,因此對於只能看到頭文件的類的外部用戶不可見。這更好地隱藏了課程的內部實現。

一般來說,現在的屬性可以有自動合成實例變量和其他高德可以直接宣佈在@implementation塊,我看不出有什麼理由你應該都在你的@interface(向後兼容性分開)申報的高德。

爲什麼要聲明這個NSString在一個範圍內?

因爲這是聲明實例變量的唯一方法。否則,你會聲明一個變量,它可以從同一個文件中的任何地方訪問(參見他的評論中鏈接到的BoltClock問題)。

+0

所以,如果我聲明NSString超出範圍,它會成爲一個全局變量?我的意思是任何外部類可以訪問變量? –

+4

排序;看到一些想法是愚蠢的,因爲它涵蓋了ivars和全局/靜態之間的區別。請注意,'@ implementation'中的ivar聲明是相對較新的 - 由於編譯器生成的類的方式,它在32位Mac OS X運行時中不可行。一旦「脆弱的基類」問題得到解決,就有可能在主''interface'之外進行自動合成和/或聲明ivars。 – bbum