2012-04-27 66 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会为你添加伊娃。

如果你正在使用的界面生成器,只需使用助理编辑和控制拖动元素到各自的头文件中的物业面积。这可以节省大量的时间。