实现(.m)文件中的IBOutlet实例变量

Enc*_*ada 15 cocoa objective-c

假设我有一个视图控制器或一个窗口控制器,它(通常)是相应XIB文件中的"文件所有者".

(众所周知)IBOutlet在控制器类中有s 非常常见,然后可以使用Interface Builder在XIB中连接.

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

这就是为什么我现在 - 自Objective-C最近开始提供这样做的能力 - 想要将我IBOutlet的所有s放入我的实现(.m)文件.

我试过这样做,这似乎工作正常.我的问题是:为什么这有效?我的印象是Interface Builder只能查看类的头文件 - 而不是查看它们的实现文件.我错了吗?为什么Interface Builder可以"看到"实现文件?将IBOutlet实例变量放入实现文件中是否有潜在危险?

Geo*_*roy 12

来自Xcode 4用户指南

注意:因为Xcode 4会解析您的头文件和实现文件以进行索引,所以您可以在实现(.m)文件中定义操作和出口,而无需将它们放在头文件中,您可以直接从nib文件连接到实施文件.因此,您无需向可能正在使用您的类的客户端公开您的部分界面或操作.

并且将IBOutlet实例变量放入实现文件中是否有潜在危险?

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

  • @pe60t0 IBOutlets/Actions 通常从图形界面访问,由另一段代码解析。因此,此代码将引用您定义为“私有”的方法和属性。它在某种程度上打破了封装原则。如果必须从外部访问您的代码,请公开声明。如果您不想让人们弄乱它,请发表评论。 (2认同)