2014-08-29 123 views
3

簡單的問題,我只想聽聽其他人做什麼,以及最佳實踐可能是什麼。清理一些事情。iOS實例變量

當在我的一個視圖控制器中聲明一個實例變量時。哪裏是適合申報的地方?我想實例變量,以提供給所有的方法在視圖控制器/功能

我已經看到了這樣做的方式,在.h文件花括號中@interface後:

@interface ViewController : UIViewController { 
    NSString *test3; 
} 

我已經看到它這樣做的方式,在.m文件花括號中@interface後:

@interface ViewController() { 
    NSString *test1; 
} 

而後,我已經看到了這樣做的方式,在.m文件在大括號:

@implementation ViewController { 
    NSString *test2; 
} 

什麼是最佳實踐?有什麼區別嗎?如果是的話,他們會是什麼樣的,什麼使得一種方式比另一種更好?

所有幫助將不勝感激, 謝謝。

回答

3

任何這些都可以,但目前的最佳做法是使用財產。如果你希望它是隻能訪問你的類中:

@interface ViewController() 

@property (copy, nonatomic) NSString *test1; 

@end 

像這樣的訪問它:

self.test1 = @"Hello, world"; 

但是,如果你希望它是其他類訪問爲好,把它放在公共接口:

@interface ViewController : UIViewController 

@property (copy, nonatomic) NSString *test1; 

@end 

,然後訪問它像這樣:

someInstanceOfViewController.test1 = @"Hello, world"; 

如果您需要直接訪問實例變量(並且這在大多數情況下僅適用於類內部),例如,如果您正在創建自定義設置器,編譯器將自動合成作爲屬性名稱的ivar前面加上下劃線:

- (void)setTest1:(NSString *)test1 
{ 
    _test1 = [test1 copy]; 
} 

注:copy是因爲你可以設置test1NSMutableString一個實例,你可能不希望從下你的內容得到了突變。當您重寫setter時,如上所述,您必須自己執行此語義。

+0

那麼目前的最佳做法是屬性> iVars? – 2014-08-29 15:49:14

+0

你會發現分歧,但大多數風格指南走這條路。通常,合成的getter/setter方法調用引起的開銷不明顯。 – 2014-08-29 15:56:39