Iphone 目标C属性规则

Iphone 目标C属性规则,iphone,objective-c,ios,properties,Iphone,Objective C,Ios,Properties,我对Objective-C中属性的用法感到困惑。如果我创建一个新的IBOutlet,如下所示: IBOutlet UISlider *uploadSlider; @synthesize something = _something; 然后定义滑块的属性,以便使用其getter和setter: @property (nonatomic, strong) IBOutlet UISlider *uploadSlider; 然后在实现文件中合成它,实际使用该属性的正确方法是什么?例如,如果要更改滑

我对Objective-C中属性的用法感到困惑。如果我创建一个新的
IBOutlet
,如下所示:

IBOutlet UISlider *uploadSlider;
@synthesize something = _something;
然后定义滑块的属性,以便使用其getter和setter:

@property (nonatomic, strong) IBOutlet UISlider *uploadSlider;
然后在实现文件中合成它,实际使用该属性的正确方法是什么?例如,如果要更改滑块的轨迹图像,是否调用

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

我用
self
作为前缀的方法只有在定义属性之后才可用,这使我认为它是正确的选择。但我不明白为什么。我甚至需要属性来访问这些方法吗


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

正确的方法是使用self

如果您正确地将合成设置为如下所示,则不应使用第一种方法:

IBOutlet UISlider *uploadSlider;
@synthesize something = _something;
这是因为在第一种方法中,您直接访问ivar,这是在使用属性时应该尽量避免的

忘了提了

点表示法只是setter和getter方法进行键入的快捷方式 快一点。然而,我真的不建议你去适应它,因为它打破了传统 目标C的消息式体系结构的一致性

顺便说一句,2注:

您不需要自己设置ivar,只要将其设置为@property,然后设置为@synthesis,xcode就会为您添加ivar


如果您使用的是interface builder,只需使用助手编辑器和控件将元素拖动到相应头文件中的属性区域。这节省了大量的时间。

正确的方法是自我管理

如果您正确地将合成设置为如下所示,则不应使用第一种方法:

IBOutlet UISlider *uploadSlider;
@synthesize something = _something;
这是因为在第一种方法中,您直接访问ivar,这是在使用属性时应该尽量避免的

忘了提了

点表示法只是setter和getter方法进行键入的快捷方式 快一点。然而,我真的不建议你去适应它,因为它打破了传统 目标C的消息式体系结构的一致性

顺便说一句,2注:

您不需要自己设置ivar,只要将其设置为@property,然后设置为@synthesis,xcode就会为您添加ivar


如果您使用的是interface builder,只需使用助手编辑器和控件将元素拖动到相应头文件中的属性区域。这节省了大量的时间。

当前的最佳做法是,如果您希望.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文件中,你像这样放置@synthesis

 @synthesize uploadSlider = _uploadSlider;
它将生成getter和setter以及一个名为_uploadSlider的实例变量,以便您知道如何访问它

那么,正确的称呼方式是:

[self.uploadSlider]
这和

[self getUploadSlider]

另外,请注意,当您查看Apple文档时,任何属性都应该使用调用。应使用该消息调用语法和其他任何内容。

当前的最佳做法是,如果希望.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文件中,你像这样放置@synthesis

 @synthesize uploadSlider = _uploadSlider;
它将生成getter和setter以及一个名为_uploadSlider的实例变量,以便您知道如何访问它

那么,正确的称呼方式是:

[self.uploadSlider]
这和

[self getUploadSlider]

另外,请注意,当您查看Apple文档时,任何属性都应该使用调用。应使用此消息调用语法和其他任何内容。

谢谢。为什么IBoutlet通常很弱?因为它们通常是在故事板中创建的,所以它们从故事板视图中具有很强的参考价值。通过使属性变弱,当视图释放对它们的强引用时,它们将被解除分配。因此,从理论上讲,您不需要将它们设置为nil,但大多数示例都会这样做。为了进一步解释,当您将UIObject拖动到故事板中的视图时,它会添加UIObject,并且视图中有一个指向该对象的强指针。如果不创建IBOutlet,则在加载和卸载该视图时,它将已被分配和解除分配。如果创建指向该对象的强指针,则在设置该对象时,只要将其设置为存在,该UIObject就不会被解除分配,即使该视图已解除分配。在viewDidUnload中将UIObject设置为nil可以解决此问题。如果您是从代码创建UIObject,那么它应该是强大的。太好了,谢谢。我使用的是ARC,它显然不需要显式解除锁定对象。但除了将所有属性设置为nil(不确定具体在哪个方法中),我还需要做什么其他清理来确保我优雅地退出应用程序?这是一个大问题!它因不同的情况而不同,对于在UIViewControllers中拖入故事板的IBOutlets,将它们设置为弱属性,然后在viewDidUnload中设置为nil。ARC应该照顾你的大部分物品。您不必担心方法中的局部变量,它们在方法执行时结束。理论上,只要设置t,ARC就应该考虑实例变量