整理 Objective-C/XCode 的 #import 语句

10

在使用Objective-C编程几个月后,我已经完全明白何时需要使用#import,导入语句如何级联(波及?),以及何时使用转发类。但是,我不知道如何将导入的内容聚合到<>内而不是引号内(尽管也许只是针对框架)...

问题在于,我弄得一团糟。我来自Java(和笨重的IDE),所以我会在需要时添加导入。有时我会将它们添加到接口中,但是由于通常不必要,所以我只将它们添加到相关的.m文件的顶部。

今天我开始思考:肯定有一些规则可以组织这些东西。实际上,由于Objective-C是C的超集,对于任何事情都有一些规则,但是我不知道它们。 我应该如何组织我的导入?特别是:

  • 我应该什么时候在.m中导入?
  • 我应该什么时候在.h中导入?
  • 我应该仅仅为了导入它们而创建.h文件吗(例如仅包含导入语句的头文件)?如果是这样,有没有关于组织它们的提示?

这只是我试图弄清楚的一般想法。

3个回答

5
<....>语法确实只适用于框架。但这并不意味着你不应该创建一个包含应用程序核心逻辑的框架。如果你:
a)需要为可加载的捆绑包提供支持,这些捆绑包想调用你的应用程序逻辑的方面(捆绑包链接到框架,因此也链接到你的应用程序)。
b)编写多个共享相同核心逻辑的应用程序。
虽然你的问题有些主观,会得到争论双方的开发人员,但我遵循的约定是:
  1. 除非你正在对其进行子类化,否则不要在.h文件中导入类定义。对于.h中的所有内容,请使用前向@class指令。
  2. 只有在实现中发现需要使用该类时,才将类定义导入到.m
一般来说,.h不需要访问其ivars、方法参数或返回值的类定义。它只需要知道它们是类,这就是@class所允许的。它需要访问任何你正在进行子类化、添加类别或(显然)实现协议的类定义。

感谢 @d11wtq ,你真的读了问题并回答了它。这与我所做的基本相同,但是形式化有所帮助。另外,感谢您对制作框架的说明。这可能比静态库更好(https://dev59.com/gFDTa4cB1Zd3GeqPL8EW)... - Dan Rosenstark
1
刚刚看到你在开发iPhone而不是Mac。目前(至少现在)iPhone无法动态链接框架,所以你必须绕过一些障碍来编写自己的框架:http://blog.cloudmade.com/2010/05/10/iphone-static-framework/。然而,如果你将来转向Mac开发,编写框架就非常简单了 :) - d11wtq

3
忘记<...>是用于框架还是其他内容。 <...> 检查系统头文件搜索路径,而"..."在当前目录中进行检查。但需要记住的一件事是,在苹果平台上,<CoreFoo/CoreFoo.h> 声明与苹果框架有所不同:CoreFoo.framework/Headers/CoreFoo.hCoreFoo/CoreFoo.h 匹配。

2

当导入模块时,如果是放在<>中而不是引号中,意味着你正在从一个框架中导入某些内容。实际上,在这种情况下,通常的导入风格是

#import <Foundation/Foundation.h>

第一个斜杠前的Foundation是指所讨论的框架名称,而第二个则只是该框架中的一个头文件。那个头文件只是类似于:

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

包括框架中的每个文件。 对于需要多个导入的组件,您也可以这样做,这对于组件来说并不是一个坏主意(尽管在这种情况下,您可能需要单独的公共接口)。
对于其他内容,根据最佳实践的原则,您希望让事物尽可能少地了解,所以只有在必要时(如ivar或超类)才将导入放入头文件中,但这实际上只是一种口味问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接