【问题标题】:Should I put IBActions in the header file or not?我应该将 IBActions 放在头文件中吗?
【发布时间】:2013-07-25 08:00:21
【问题描述】:

鉴于 Xcode 4.6.3 中使用了 iOS SDK 6.1,是否在头文件中声明 IBAction 的方法签名有区别吗?

如果不将方法声明放在头文件中,应用程序仍然能够毫无问题地编译和运行。但是,在情节提要中看不到该方法。

头文件中没有声明方法有什么隐藏的问题吗?内存消耗有区别吗?

【问题讨论】:

  • 据我所知,它是为了支持封装(oop)。您可以从公共接口隐藏该方法并将其从代码链接到插座。通过这样做,您可以从符合 oop 的接口中隐藏实现。但我想如果你在 @interface classname() 类别中声明该方法,你可以在接口生成器中看到该方法。

标签: cocoa-touch ibaction


【解决方案1】:

IBAction 方法的全部意义在于成为 Interface Builder 中的 public 连接点(是否使用 Storyboard)。

单词IBAction 本身就是#defined 为void。它的唯一目的(IBOutlet 也是如此)是允许 Xcode 扫描您的代码并找到您的控制器需要通过 IB 连接视图的这些点。如果您以编程方式将控件连接到该方法,则不需要声明的 IBAction 部分。

没有性能差异,但在语义上,将IBAction 放在您的实现文件中并没有真正意义。拥有IBAction 意味着控制器正在通过该方法与外部对象通信,而这正是 header/public @interface 声明的用途。

【讨论】:

  • 我不知道我是否真的同意这一点。为什么需要公开?我一直使用IBAction 方法来执行内部逻辑。在封装的原则上,如果我真的需要它,难道我不想只通过公共接口公开它吗?似乎 Apple 可能已经意识到了这一点,这就是为什么他们在几个 Xcode 版本中添加了对将操作直接拖动到实现文件的支持的原因。请纠正我的错误,我很乐意为此制定最佳实践。
  • 我不确定我是否能比我在回答中更清楚地表达出来。连接到对象中IBAction 的按钮不是 内部的。它在你的对象之外——它是视图层次结构的一部分;它与周围的景色有关系。 IBActions 和 IBOutlets 根据定义是耦合点。
  • 我刚刚通读了IBActions 和IBOutlets 上的开发者文档,找不到任何要求或提及它是公开的。您是从哪里获得将IBAction 定义为“公共连接点”的?私人连接点还不够吗?例如,假设我有一个连接了 loginButtonAction 的登录屏幕。我不想将该功能暴露给我的登录视图控制器外部的任何类,那么我为什么要将 IBAction 放在 header/public @interface 中?
  • 另见此答案和相关的 cmets stackoverflow.com/a/10004301/654870
【解决方案2】:

如果你想在你的故事板/interfaz builder中连接它,或者你想公开它以供其他类调用它,只在.h文件中声明它。

如果你只想将它设为私有并且只在你的类中使用它,则不需要在头文件中声明它。

没有内存或性能差异。

【讨论】:

    【解决方案3】:

    即使您打算将它连接到界面构建器,它仍然没有在头文件中。我个人只是将它们直接放入实现文件中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多