【问题标题】:Organize #import Statements for Objective-C/XCode为 Objective-C/XCode 组织 #import 语句
【发布时间】:2010-12-18 23:08:35
【问题描述】:

在用了几个月的 Objective-C 编码之后,我完全明白什么时候需要 #import,import 语句如何级联(波纹?),以及什么时候使用转发类。我知道如何聚合导入以将它们放入 <> 而不是引号中(尽管这可能仅适用于框架)...

问题是我把事情弄得一团糟。我来自 Java(和笨拙的 IDE),所以我只添加我认为合适的导入。有时我会将它们添加到界面中,但由于这通常不是必需的,所以我只是将它们添加到有问题的 .m 的顶部。

今天我开始思考:必须有一些关于如何组织这些东西的经验法则。事实上,由于 Objective-C 是 C 的超集,一切都有经验法则,但我不知道。 我应该如何组织我的导入? 特别是:

  • 我应该什么时候导入.m
  • 我应该什么时候导入.h
  • 我是否应该创建.h 文件只是为了导入它们(即,只包含导入的头文件)?如果是这样,有什么关于组织的提示吗?

这只是我想要弄清楚的一个大致概念。

【问题讨论】:

    标签: objective-c xcode


    【解决方案1】:

    <....> 语法确实只适用于框架。这并不意味着您不应该创建一个框架来包含应用程序的核心逻辑。如果您:

    a) 需要为想要调用应用程序逻辑方面的可加载包提供支持(包链接到框架,您的应用程序也是如此) b) 编写多个共享相同核心逻辑的应用程序

    您的问题有点主观,您会遇到两种方式都争论不休的开发人员,但我遵循的惯例是:

    1. 永远不要在.h 文件中导入类定义,除非您将其子类化。对.h 中的所有内容使用转发@class 指令。
    2. 仅在您发现需要在实现中使用该类时将类定义导入.m

    一般来说,.h 不需要访问其 ivars 的类定义、方法参数或返回值。它只需要知道它们是类,这是@class 允许你做的。它确实需要访问您要继承、添加类别或(显然)实现协议的任何内容的类定义。

    【讨论】:

    • 感谢@d11wtq,感谢您实际阅读问题以及您的回复。这与我所做的几乎一致,但将其形式化会有所帮助。还要感谢有关制作框架的说明。这可能比静态库更好 (stackoverflow.com/questions/3805596/…)...
    • 刚刚阅读了其他问题,发现您正在为 iPhone 而不是 Mac 开发。 iPhone(至少目前)无法动态链接到框架,因此您必须跳过一些障碍来编写自己的框架:blog.cloudmade.com/2010/05/10/iphone-static-framework。如果你曾经转向 Mac 开发,但是编写框架是微不足道的 :)
    【解决方案2】:

    忘记<...> 是用于框架还是什么。 <...> 检查系统头搜索路径,而"..." 则检查当前目录。但是要记住的一件事是,<CoreFoo/CoreFoo.h> 声明在 Apple 平台上的处理方式略有不同,但仅与 Apple 框架相关:CoreFoo.framework/Headers/CoreFoo.hCoreFoo/CoreFoo.h 匹配

    【讨论】:

      【解决方案3】:

      当导入在 <> 中而不是引号中时,这意味着您正在从框架中导入某些内容。事实上,这样做时,导入通常是样式

      #import <Foundation/Foundation.h>
      

      斜杠前的第一个Foundation 是相关框架的名称,第二个只是该框架中的头文件。那个头文件就像

      #import <Foundation/NSObjCRuntime.h>
      #import <Foundation/NSArray.h>
      #import <Foundation/NSAutoreleasePool.h>
      ...
      #import <Foundation/NSURLHandle.h>
      

      包括该框架中的每个文件。您也可以这样做,对于需要多次导入的组件来说这不是一个坏主意(尽管在这种情况下,您可能需要一个单独的公共接口)

      对于其他内容,遵循您希望内容尽可能少地了解的经验法则,您只想在必要时将导入放在头文件中(例如对于 ivar 或超类),但实际上是口味问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-11-09
        • 1970-01-01
        • 2012-07-08
        • 1970-01-01
        • 2011-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多