连接IBOutlets,变量,属性还是两者兼而有之?

时间:2012-03-09 16:34:56

标签: ios properties iboutlet

将IB与辅助视图结合使用时,您可以控制 - 将IB中的元素拖动到.h文件并创建插座。您可以将其拖到变量声明块内部或块外部的2个位置之一。

如果你将它拖到变量块中,你可以得到这样的结果:

@interface MyViewController : UIViewController {
    IBOutlet UIButton *foo;
}

将它拖到块外会给你类似......

@interface ViewController : UIViewController {
}
@property (retain, nonatomic) IBOutlet UIButton *foo;

我已经考虑过他们的不同之处,我有点困惑。好吧,我理解合成属性在运行时会做一些魔术并创建实例变量(仅限64位/ ARM)。所以我相信我理解这两个选项是如何运作的。

但最好的选择是什么?第一个选项产生的代码更少,看起来更简单。

第二个版本提供公共访问者/ mutators,但我很少从我的课外访问插座(如果我这样做,它几乎总是使用封装)。从我开始iOS工作开始,我就专门使用了这个选项。

在大多数情况下,我是否遗漏了任何东西,还是应该切换到基于变量的插座?

3 个答案:

答案 0 :(得分:1)

在属性声明中声明IBOutlet的能力相对较新@property (retain, nonatomic) IBOutlet UIButton *foo;

以前,您必须在花括号内声明IBOutlet UIButton *foo,然后合成属性。现在,在花括号中声明IBOutlet是多余的。

现在有两种方法可以声明属性。选项1是在.h文件中声明它,这将使其公开。或者,您可以使用以下命令在.m文件中创建专用接口:

@interface MYCLASS()
@end

并在那里声明你的属性。这是我首选的方法,除非我需要公共访问该属性(如果你遵守MVC约定,这应该是例外,而不是常态)。

答案 1 :(得分:1)

简短回答:无论如何都不会产生太大的影响。

长答案:如果你想要set / mutator方法,那么拖动到块之外。如果您不关心方法并且只是直接访问变量,那么将它们作为直接变量放在块中可能是要走的路。

公众可见度: 如果您只是将IBOutlet指定为变量,则可以使用@private@protected来阻止外部访问。如果您出于某种原因确实需要@property,您仍然可以通过将该属性移出.h并进入.m文件中的类扩展来控制公众可见性。

结论:我自己,我坚持使用直接变量声明,并在需要额外内容时保存其他选项。

答案 2 :(得分:0)

IBOutlets最好在块中,除非你真的打算在.m文件中使用它。

请记住,你可以同时拥有两者。在所有基础知识中,变量块内部的一个基本上只适用于在IBActions中使用它时。

可以在.m文件中使用该属性进行进一步自定义。

同样,你可以同时使用它们,它只取决于你使用它的程度。