这些#import声明之间有什么区别?

时间:2011-05-22 21:51:03

标签: iphone objective-c import include

我将从我的应用程序发送邮件,并添加了MessageUI框架。在Apple的示例代码中,他们写道:

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>

这些之间的区别是什么,以及“斜线”在那里做什么?

2 个答案:

答案 0 :(得分:6)

斜杠基本上是说.h文件位于斜杠之前命名的框架的框架中。

两者之间的区别在于,通过使用/MessageUI.h>,您在执行与导入框架中的每个类相同的操作。当您使用/MFMailComposeViewController.h>时,您只在框架中实现了一个类。因此,除了导入的类之外,不会有其他类可用。

答案 1 :(得分:6)

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
     

这些之间有什么区别,   什么是“斜线”在那里做什么?

该工具集添加了对框架的支持,并在给定构建设置的情况下定义框架的搜索路径(例如标题和链接)。

框架定义了Headers/目录。

使用此框架路径时,可以使用路径分隔符(/)分离/发现框架路径。

使用apple的框架,第一个成语#import <FRAMEWORK_NAME/FRAMEWORK_NAME.h>是通过包含(大部分)框架的公共头文件来包含框架的公共声明的常用方法。在许多情况下,它将包含框架的公共标头的所有,但也有一些例外。在程序中使用这个习惯用法通常是最好的,因为它可以使你不受标题的内部依赖性的影响,这些依赖性可能会在各个版本中发生变化。

第二种形式与第一种形式相同,因为它们都指定了要包含的特定标题。它的不同之处在于您明确地包含了一个特定的标题 - 在大多数情况下,这意味着您只包含框架标题的一部分(当框架的主要包含结构为apple方式时)。许多库不是以这种方式使用的 - 编译器可能会遇到未声明的类型(作为示例)。在这种情况下,如果遇到构建错误,则必须包含头的附加依赖项。

您可能更喜欢第一种形式有几个原因,主要原因是易于维护。体贴的框架维护者将准确地包括框架的头部必须包含的内容而不会出错。

还有一些理由可以选择后一种形式:

  • 语言差异:框架可能使用多种语言。根据正在编译的语言/方言,包括整个框架可能会明显引入构建错误。
  • 您只需要对外部翻译可见的框架声明的一部分:指定您需要显示的标头可以减少构建时间和依赖关系。
  • 兼容性和最小依赖性:假设您已经编写了一个针对多个平台(例如osx和ios)的库。您的图书馆可能使用不同的框架/ apis。特定的包含可以最小化问题/依赖的数量,或者您可以有选择地包括必要的内容。