Objective-C属性规则

时间:2012-04-27 00:25:40

标签: iphone objective-c ios properties

我对Objective-C中属性的使用感到困惑。如果我像这样创建一个新的IBOutlet

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前缀的方法仅在定义属性后才可用,这使我认为它是正确的选择。但我不明白为什么。我甚至需要属性来访问这些方法吗?

另外,如果我使用点语法来获取或设置与对象有关的信息,我是否必须定义对象的属性,即使我没有直接访问其实例方法之一?

2 个答案:

答案 0 :(得分:2)

正确的方法是自我。

如果您正确设置合成,则不应该以第一种方式执行此操作:

@synthesize something = _something;

这是因为在第一种方法中你直接访问你的ivar,这是你在使用属性时应该避免的。

忘了提。

点符号只是setter和getter方法进行输入的快捷方式 东西更快。但是我真的不建议你习惯它,因为它打破了 消息的一致性,如客观C的架构。

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

BTW,2注:

您不需要自己设置ivar,只要将其设置为@property然后再设置为@synthesize xcode将为您添加ivar。

如果您正在使用界面构建器,只需使用助手编辑器并控制将元素拖动到相应头文件中的属性区域。这节省了大量时间。

答案 1 :(得分:2)

目前的最佳做法是将此文件放在您的.h文件中,如果您希望将其公开提供,或者将其放在.m文件的界面部分中(如果您希望它是私有的(可能是您想要的))。另外,IBoutlet通常使用弱指针,并且应该在viewDidUnload方法中设置为nil。

所以,在你的.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]

此外,为了您的信息,当您查看Apple文档时,应使用以下方法调用任何属性。应该使用消息调用语法和其他任何内容。