2013-09-22 130 views
394

我正在玩弄一些新的iOS 7功能,并使用WWDC视频“在iOS上实现使用UI”中讨论的一些图像效果。为了生产用于会话的源代码中的模糊效果,UIImage经其中进口的UIKit像这样一个分类的扩展:@import vs #import - iOS 7

@import UIKit; 

我觉得我看到了一些关于这在另一个会话视频,但我无法找到它。我正在寻找任何有关何时使用此功能的背景信息。它只能用于Apple框架吗?使用此编译器指令的好处是否足以让我回去更新旧代码?

+0

http://stackoverflow.com/questions/29701647/use-看看当模块被禁用进口时 –

+0

http://stackoverflow.com/questions/29701647/use-of-import-when-modules-are-disabled –

回答

798

这是一个新功能,称为模块或“语义导入”。有关Session 205404WWDC 2013视频中有更多信息。这是预编译头文件的更好实现。 您可以将模块用于iOS 7和Mavericks中的任何系统框架。模块是框架可执行文件和它的头文件的封装,并被吹捧为比#import更安全和更高效。

使用@import的一大优势是您不需要在项目设置中添加框架,它会自动完成。这意味着您可以跳过单击加号按钮并搜索框架(金色工具箱)的步骤,然后将其移至“框架”组。它可以节省许多开发人员的神秘“链接器错误”消息。

实际上您并不需要使用@import关键字。如果您选择使用模块,则所有#import#include指令将自动映射为使用@import。这意味着您不必更改源代码(或从其他位置下载的库的源代码)。假设使用模块也会提高构建性能,尤其是如果您没有很好地使用PCH,或者您的项目有许多小型源文件。

模块是为大多数Apple框架(UIKit,MapKit,GameKit等)预先构建的。您可以将它们与您自己创建的框架一起使用:如果您在Xcode中创建Swift框架,它们会自动创建,并且您可以手动为any Apple or 3rd-party library自己创建一个“.modulemap”文件。

可以使用代码完成以查看可用的框架的列表:

enter image description here

模块默认情况下,在新的项目在Xcode 5启用。要在较旧的项目中启用它们,请进入项目构建设置,搜索“模块”并将“启用模块”设置为“是”。 “链接框架”应该是“YES”太:

你要使用的Xcode 5和iOS的7或小牛SDK,但你仍然可以释放的旧式OS(说的iOS 4.3或什么)。 模块不会改变您的代码的构建方式或任何源代码。


从WWDC幻灯片:

  • 进口完整的框架语义描述
  • 不需要解析头
  • 更好的方式来导入一个框架的接口
  • 加载二进制表示
  • 比预编译的头文件更灵活
  • 免受本地宏定义的影响(例如, #define readonly 0x01
  • 默认情况下启用为新项目

要明确使用的模块:

更换#import <Cocoa/Cocoa.h>@import Cocoa;

您还可以导入只有一个头与此表示法:

@import iAd.ADBannerView; 

您在Xcode中的子模块自动完成。

+14

@DaveDeLong&Klaas:谢谢!我不得不承认,当我第一次回答这个问题时,我对模块一无所知。我去看了会话404以了解它。 Doug Gregor(LLVM家伙)给出的演示非常精彩。还有一个C++模块对话,在这里解释了这些优势:http://www.youtube.com/watch?v=4Xo9iH5VLQ0 –

+3

@ nevan--感谢您的回答。我只想补充说,模块目前还不支持第三方和你自己的框架。 – jamdaddy25

+0

你可以使用这个为你自己的课程? – cfischer

2

它目前只适用于内置的系统框架。如果您使用#import像苹果一样仍然在应用程序委托中导入UIKit框架,它将被替换(如果模块处于打开状态并且它被识别为系统框架),编译器会将其重新映射为模块导入,而不是导入标题无论如何。 因此,离开#import将与其尽可能转换为模块导入相同

1

使用模块有几个好处。除非创建模块映射,否则只能在Apple的框架中使用它。当添加到.pch文件时,@import与预编译头文件有点相似,这是调整应用编译过程的一种方式。此外,您不必以旧的方式添加库,实际上使用@import的速度更快,效率更高。如果你仍然期待一个很好的参考,我会强烈推荐你阅读this article

39

很高兴回答您可以在本书的学习可可找到的Objective-C(ISBN:978-1-491-90139-7)

模块是包括和链接文件和库文件到你的项目的一种新手段。为了理解模块是如何工作的以及它们有什么好处,重新回顾Objective-C和#import语句的历史非常重要 无论何时您想包含要使用的文件,通常都会有一些代码看起来像这样:

#import "someFile.h" 

或者在框架的情况下:

#import <SomeLibrary/SomeFile.h> 

由于Objective-C是C语言的超集,将#import语句是在C'S #include声明未成年细化。 #include语句非常简单;它会在编译过程中将包含文件中发现的所有内容复制到您的代码中。这有时会导致重大问题。例如,假设您有两个头文件:SomeFileA.hSomeFileB.h;包括SomeFileB.hSomeFileB.h包括SomeFileA.h。这会产生一个循环,并可能使coimpiler感到困惑。为了解决这个问题,C程序员必须防范这种事件的发生。

当使用#import时,您不必担心此问题或编写标头警卫来避免它。但是,#import仍然只是一个优化的复制和粘贴操作,导致其他一些较小但仍然非常危险的问题(例如,包含的文件覆盖了您在其他代码中声明的某些内容)的编译时间较慢。

模块是为了解决这个问题。它们不再是对源代码的复制和粘贴,而是包含文件的序列化表示,只有在需要时才可以将它们导入到源代码中。通过使用模块,代码通常会更快地编译,并且比使用#include或#import更安全。

回到导入框架的前面的例子:

#import <SomeLibrary/SomeFile.h> 

导入这个库作为一个模块,代码将改为:

@import SomeLibrary; 

这样做的Xcode的好处将SomeLibrary框架自动链接到项目中。模块还允许您只将真正需要的组件包含到项目中。例如,如果你想在AwesomeLibrary框架中使用AwesomeObject组件,通常你将不得不导入所有东西来使用它。然而,使用模块,你可以输入你想要使用的特定对象:

@import AwesomeLibrary.AwesomeObject; 

对于在Xcode 5的所有新项目,模块默认情况下启用。如果您想在较旧的项目中使用模块(而且您确实应该),则必须在项目的构建设置中启用它们。一旦你这样做了,你可以在你的代码中同时使用#import@import声明而不用担心。

+0

在我的项目(Xcode 6)中,我没有选择启用Xcode 4以启用模块。我可以手动添加它吗? –

+0

构建目标是iOS 6,我认为这是问题 –