【问题标题】:Objective-C Properties RuleObjective-C 属性规则
【发布时间】:2012-05-07 18:18:07
【问题描述】:

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

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

【问题讨论】:

标签: iphone objective-c ios properties


【解决方案1】:

正确的方法是用self。

如果你像这样正确设置合成器,你不应该能够做到第一种方式:

@synthesize something = _something;

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

忘了说。

点表示法只是 setter 和 getter 方法键入的快捷方式 东西更快。但是我真的不建议你习惯它,因为它破坏了 消息的一致性,如目标 C 的架构。

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

顺便说一句,2 个音符:

你不需要自己设置ivar,只要你把它设置为@property然后@synthesize xcode就会为你添加ivar。

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

【讨论】:

    【解决方案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 文档时,应该使用 .应该使用该消息调用语法和其他任何内容。

    【讨论】:

    • 谢谢。为什么 IBOutlets 通常很弱?
    • 由于它们通常是在情节提要中创建的,因此它们在情节提要视图中具有很强的参考意义。通过使属性变弱,当视图释放对它们的强引用时,它们将被释放。因此,理论上,您不需要将它们设置为 nil,但大多数示例还是会这样做。
    • 为了进一步解释,当您将 UIObject 拖到情节提要中的视图时,它会添加 UIObject 并且存在从视图到该对象的强指针。如果您不创建 IBOutlet,则在加载和卸载该视图时,它已经被分配和释放。如果你创建了一个指向它的强指针,那么当你设置它时,只要你设置的 UIObject 存在,即使视图被解除分配,它也不会被解除分配。在 viewDidUnload 中将 UIObject 设置为 nil 可以解决这个问题。如果您是从代码创建 UIObject,那么它应该很强大。
    • 太好了,谢谢。我正在使用 ARC,它显然不需要明确地释放对象。但是除了将所有属性设置为 nil(不确定具体使用哪种方法)之外,我还需要做哪些其他清理工作以确保我能够优雅地退出应用程序?
    • 这是个大问题!它因不同的事物而异,对于拖入 UIViewControllers 中的故事板的 IBOutlets,它是将它们设置为弱属性,然后在 viewDidUnload 中设置为 nil。 ARC 应该处理您的大部分对象。您无需担心方法中的局部变量,它们会在方法执行时结束。理论上,只要您正确设置属性,ARC 就应该处理实例变量。此外,了解一些分析工具,以便了解您的应用程序如何使用内存。此外,请查看 Apple 参考资料,了解是否是负责任的后台应用程序。
    猜你喜欢
    • 2017-04-15
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多