将IB与辅助视图结合使用时,您可以控制 - 将IB中的元素拖动到.h文件并创建插座。您可以将其拖到变量声明块内部或块外部的2个位置之一。
如果你将它拖到变量块中,你可以得到这样的结果:
@interface MyViewController : UIViewController {
IBOutlet UIButton *foo;
}
将它拖到块外会给你类似......
@interface ViewController : UIViewController {
}
@property (retain, nonatomic) IBOutlet UIButton *foo;
我已经考虑过他们的不同之处,我有点困惑。好吧,我理解合成属性在运行时会做一些魔术并创建实例变量(仅限64位/ ARM)。所以我相信我理解这两个选项是如何运作的。
但最好的选择是什么?第一个选项产生的代码更少,看起来更简单。
第二个版本提供公共访问者/ mutators,但我很少从我的课外访问插座(如果我这样做,它几乎总是使用封装)。从我开始iOS工作开始,我就专门使用了这个选项。
在大多数情况下,我是否遗漏了任何东西,还是应该切换到基于变量的插座?
答案 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文件中使用该属性进行进一步自定义。
同样,你可以同时使用它们,它只取决于你使用它的程度。