2012-04-27 64 views
2

我對Objective-C中的屬性的使用感到困惑。如果我創建一個新的IBOutlet這樣的:Objective-C屬性規則

IBOutlet UISlider *uploadSlider; 

,然後定義屬性滑塊,所以我可以用它的getter和setter方法:

@property (nonatomic, strong) IBOutlet UISlider *uploadSlider; 

然後@synthesize它在實現文件,是什麼是實際使用該財產的正確方法?例如,如果我想改變滑塊的軌道像,我叫

[uploadSlider setMaximumTrackImage:[UIImage imageNamed:@"An image"] forState:UIControlStateSelected]; 

或者:

[self.uploadSlider setMaximumTrackImage:[UIImage imageNamed:@"An image"] forState:UIControlStateSelected]; 

,我與self前綴的方法是唯一可用的定義屬性之後,這讓我想到這是正確的選擇。但我不明白爲什麼。我甚至需要屬性來訪問這些方法?另外,如果我使用點語法來獲取或設置與某個對象有關的信息,我是否必須爲該對象定義屬性,即使我沒有直接訪問它的某個實例方法?

+0

可能重複: http://stackoverflow.com/questions/2032826/property-synthesize http://stackoverflow.com/questions/6425588/property-implementation-of-variables-in-objective-c HTTP :http://stackoverflow.com/questions/2032826/property-synthesize http://stackoverflow.com/questions/806379/whats-the-difference-between-property-and-synthesize http://stackoverflow.com/questions/6112283/question-about-synthesize http://stackoverflow.com/questions/1398305/objective-c-property-access – CodaFi 2012-04-27 01:30:06

回答

2

目前最好的做法是把這個在您的.h文件中,如果你希望它是公開可用的或在您的.m文件的接口部分,如果你希望它是私有的(你想這可能是什麼)。另外,IBoutlet通常使用弱指針,並且應該在viewDidUnload方法中設置爲零。

所以,在您的.h文件中,如果公共

@property (nonatomic, strong) IBOutlet UISlider *uploadSlider; 
//IBOutlet's are usually weak 

或在你的。M檔,如果私人

@interface 
@property (nonatomic, strong) IBOutlet UISlider *uploadSlider; 
//IBOutlet's are usually weak 
@end 

然後,在你的.m文件你把@synthesize這樣

@synthesize uploadSlider = _uploadSlider; 

將生成的getter和setter,也稱爲_uploadSlider的實例變量,讓你意識到你如何訪問它。

然後,把它叫做正確的方法是:

[self.uploadSlider] 

這是真的一樣

[self getUploadSlider] 

此外,對於您的信息,當你在蘋果文檔,任何在外觀,是應該使用該屬性調用的屬性。語法和其他任何東西都應該使用消息來調用。

+0

謝謝。爲什麼IBOutlets通常很弱? – 2012-04-27 00:46:13

+2

由於它們通常是在故事板中創建的,因此它們具有故事板視圖的強大參考。通過使財產變弱,當視圖釋放對它們的強烈引用時,它們將被釋放。因此,理論上你不需要將它們設置爲零,但大多數例子都是這樣做的。 – Nick 2012-04-27 00:52:24

+0

爲了進一步解釋,當您將UIObject拖動到故事板中的視圖時,它將添加UIObject,並且從該視圖到該對象有一個強指針。如果您未創建IBOutlet,則在加載和卸載該視圖時,它已被分配和釋放。如果你爲它創建了一個強指針,那麼當你設置它的時候,只要你設置它存在,即使視圖被解除分配,該UIObject也不會被釋放。在viewDidUnload中將UIObject設置爲nil可以解決這個問題。如果您是從代碼創建UIObject,那麼它應該很強大。 – Nick 2012-04-27 00:57:03

2

正確的方法是與自我。

你不應該能夠做到這一點的第一種方式,如果你正確設置這樣的合成:

@synthesize something = _something; 

這是因爲在第一種方法要直接訪問你的伊娃這是你應該儘量避免使用屬性。

忘了提。

點符號只是爲setter和getter方法的快捷方式,使 東西更快的打字。但是我真的不建議你習慣它,因爲它打破了信息的一致性 像客觀的C.建築

http://weblog.bignerdranch.com/?p=83

BTW,2注:

你不需要自己設置伊娃,只要你把它設置爲@property,然後到@synthesize xcode會爲你添加伊娃。

如果你正在使用的界面生成器,只需使用助理編輯和控制拖動元素到各自的頭文件中的物業面積。這可以節省大量的時間。