2

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

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

4

2 回答 2

2

正确的方法是与自己。

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

@synthesize something = _something;

这是因为在第一种方法中,您直接访问您的 ivar,这是您在使用属性时应尽量避免的事情。

忘了提。

点符号只是 setter 和 getter 方法的快捷方式,可以加快输入内容的速度。但是我真的不建议您习惯它,因为它破坏了消息的一致性,例如目标 C 的体系结构。

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

顺便说一句,2 个注释:

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

如果您使用的是界面生成器,只需使用助手编辑器并控制将元素拖动到相应头文件中的属性区域即可。这可以节省大量时间。

于 2012-04-27T00:27:59.617 回答
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 文档时,应该使用 . 应该使用该消息调用语法和其他任何内容。

于 2012-04-27T00:34:58.193 回答