2012-11-21 41 views
4

目前,我可以寫這樣一個類:可以使用爲自動合成屬性創建的實例變量嗎?

@interface Foo 
@property(assign) float bar; 
@end 

@implementation Foo 

- (void) someMethod 
{ 
    _bar = 4; 
} 

@end 

它的方便,我可以離開了@synthesize樣板列表,如果我能習慣下劃線符號,我得到了很好的可讀性規則,一切都命名_foo是一個實例變量。使用像這樣的自動生成的實例變量可以嗎?我的意思是,也許他們應該對於課堂作者是隱形的?

+0

你真的應該指的是「'self.bar'」,而不是直接訪問「'_bar'」而不是init方法。 –

+3

爲什麼?我瞭解訪問者和普通實例變量之間的區別,我不明白爲什麼我應該始終訪問訪問者。封裝不在這裏,因爲我們正在討論實現類本身的代碼。 – zoul

+0

在浮動的情況下,我不認爲它很重要,但對於對象類型,我認爲你需要使用訪問器方法。只是因爲您不想繞過插入到屬性設置器中的保留/釋放代碼。如果我完全錯了,我肯定有人會糾正我。 – Dcritelli

回答

3

是的,使用這些變量絕對可以。

完全需要刪除@synthesize是一種方便:現在隱式插入@synthesize xyz - 這是唯一的區別。編譯器的設計者認爲,由於他們可以明確地識別想要合成訪問器的情況與提供自定義實現的情況,因此停止詢問顯式的@synthesize是合理的。

+1

請注意:爲了與舊Xcode版本創建的代碼兼容,我認爲'@synthesize xyz'仍然與'@synthesize xyz = xyz'(沒有下劃線)相同。省略'@ synthesize'與'@synthesize xyz = _xyz'(帶下劃線)相同。 –

+0

@MartinR非常感謝你,你是對的。我想我應該在凌晨之前停止回答問題:) – dasblinkenlight

2

可以使用爲自動合成屬性創建的實例變量嗎?

絕對

它的方便,我可以離開了@synthesize樣板列表,如果我能習慣下劃線符號,我得到了很好的可讀性規則,一切命名爲_foo是一個實例變量。

當然,您還可以使用@synthesize foo = f00;指定名稱。

可以使用自動生成的實例變量嗎?我的意思是,即使是作者,他們也不應該隱身嗎?

沒有。這是必要的他們可以在內部訪問。如果您使用ARC,那麼這種情況就不那麼頻繁了,但是您直接訪問它們的常見情況是初始化和銷燬​​(不應使用訪問器方法的情況)。

相關問題