2012-01-03 28 views
15

假设我有一个视图控制器或窗口控制器,它是(像往常一样)对应XIB文件中的“文件所有者”。实现中的IBOutlet实例变量(.m)文件

它是(众所周知)在控制器类中有IBOutlet s很常见,然后可以使用Interface Builder在XIB中进行连接。

到现在为止,我一直在我的界面(.h)文件中创建IBOutlet实例变量。但是(众所周知)IBOutlet通常是控制器类的私有机制;外人甚至不应该知道他们。

这就是为什么我现在自Objective-C最近开始提供这样做的能力 - 希望将我所有的IBOutlet都放到我​​的实现(.m)文件中。

我试过这样做,这似乎工作正常。 我的问题是这些:为什么这个有效?我的印象是Interface Builder只能查看类的头文件 - 而不是窥探他们的实现文件。我错了吗? Interface Builder如何“看到”实现文件?将IBOutlet实例变量放入实现文件可能会带来潜在危险吗?

+1

请注意,只有在Mac上使用现代运行时才可能,这意味着只有64位。传统的运行时需要在头文件中声明所有的ivars。 – 2012-01-03 22:31:44

回答

12

Xcode 4 User Guide

注:由于Xcode的4解析两个头文件和实施 文件建立索引,可以定义 实现(.M)文件的行动和出口,而不需要将它们放在标头 文件,您可以直接从nib文件连接到 实施文件。因此,您不需要向可能正在使用您的课程的客户公开您的界面或操作的部分内容。

而对于难道是潜在的危险把IBOutlet中的实例变量进入执行文件?

是的,但没有那么多,因为在运行时缺乏访问范围,因此可以访问任何已声明的方法。即使该方法不可访问,解析也是在运行时完成的,并且没有访问范围信息附加到该方法。 这可能已经实现,但Objective-C缺少如C++或Java中的privateprotected等等。 请注意,实现这种行为在运行时会更慢。

+1

您能否解释为什么在实现文件中使用IBOutlet ivars有潜在危险? – 2012-01-04 09:46:02

+0

因为这意味着你的一些代码有意访问你的私有数据,而这些数据在设计上是危险的,并且违反了OOP范式 – Geoffroy 2012-01-04 13:14:27

+0

@Geoffroy,所以你认为在实现文件中包含IBOutlet和IBAction是个坏主意只要? – Enchilada 2012-01-04 14:16:33