我对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
前缀的方法仅在定义属性后才可用,这使我认为它是正确的选择。但我不明白为什么。我甚至需要属性来访问这些方法吗?
另外,如果我使用点语法来获取或设置与对象有关的信息,我是否必须定义对象的属性,即使我没有直接访问其实例方法之一?
答案 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文档时,应使用以下方法调用任何属性。应该使用消息调用语法和其他任何内容。