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

Luc*_*uke 5 iphone import objective-c include

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

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
Run Code Online (Sandbox Code Playgroud)

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

max*_*ax_ 6

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

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

  • 我可以问它有什么问题吗?请纠正我,我会更新答案. (2认同)

jus*_*tin 6

#import <MessageUI/MessageUI.h>
#import <MessageUI/MFMailComposeViewController.h>
Run Code Online (Sandbox Code Playgroud)

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

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

框架定义了一个Headers/目录.

使用此方法,可以使用路径分隔符(/)分隔时解析/发现框架路径.

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

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

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

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

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