我正在玩弄一些新的iOS 7功能,并使用WWDC视频“在iOS上实现使用UI”中讨论的一些图像效果。为了生产用于会话的源代码中的模糊效果,UIImage
经其中进口的UIKit像这样一个分类的扩展:@import vs #import - iOS 7
@import UIKit;
我觉得我看到了一些关于这在另一个会话视频,但我无法找到它。我正在寻找任何有关何时使用此功能的背景信息。它只能用于Apple框架吗?使用此编译器指令的好处是否足以让我回去更新旧代码?
我正在玩弄一些新的iOS 7功能,并使用WWDC视频“在iOS上实现使用UI”中讨论的一些图像效果。为了生产用于会话的源代码中的模糊效果,UIImage
经其中进口的UIKit像这样一个分类的扩展:@import vs #import - iOS 7
@import UIKit;
我觉得我看到了一些关于这在另一个会话视频,但我无法找到它。我正在寻找任何有关何时使用此功能的背景信息。它只能用于Apple框架吗?使用此编译器指令的好处是否足以让我回去更新旧代码?
这是一个新功能,称为模块或“语义导入”。有关Session 205和404的WWDC 2013视频中有更多信息。这是预编译头文件的更好实现。 您可以将模块用于iOS 7和Mavericks中的任何系统框架。模块是框架可执行文件和它的头文件的封装,并被吹捧为比#import
更安全和更高效。
使用@import
的一大优势是您不需要在项目设置中添加框架,它会自动完成。这意味着您可以跳过单击加号按钮并搜索框架(金色工具箱)的步骤,然后将其移至“框架”组。它可以节省许多开发人员的神秘“链接器错误”消息。
实际上您并不需要使用@import
关键字。如果您选择使用模块,则所有#import
和#include
指令将自动映射为使用@import
。这意味着您不必更改源代码(或从其他位置下载的库的源代码)。假设使用模块也会提高构建性能,尤其是如果您没有很好地使用PCH,或者您的项目有许多小型源文件。
模块是为大多数Apple框架(UIKit,MapKit,GameKit等)预先构建的。您可以将它们与您自己创建的框架一起使用:如果您在Xcode中创建Swift框架,它们会自动创建,并且您可以手动为any Apple or 3rd-party library自己创建一个“.modulemap”文件。
可以使用代码完成以查看可用的框架的列表:
模块默认情况下,在新的项目在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中的子模块自动完成。
@DaveDeLong&Klaas:谢谢!我不得不承认,当我第一次回答这个问题时,我对模块一无所知。我去看了会话404以了解它。 Doug Gregor(LLVM家伙)给出的演示非常精彩。还有一个C++模块对话,在这里解释了这些优势:http://www.youtube.com/watch?v=4Xo9iH5VLQ0 –
@ nevan--感谢您的回答。我只想补充说,模块目前还不支持第三方和你自己的框架。 – jamdaddy25
你可以使用这个为你自己的课程? – cfischer
它目前只适用于内置的系统框架。如果您使用#import
像苹果一样仍然在应用程序委托中导入UIKit
框架,它将被替换(如果模块处于打开状态并且它被识别为系统框架),编译器会将其重新映射为模块导入,而不是导入标题无论如何。 因此,离开#import
将与其尽可能转换为模块导入相同
使用模块有几个好处。除非创建模块映射,否则只能在Apple的框架中使用它。当添加到.pch
文件时,@import
与预编译头文件有点相似,这是调整应用编译过程的一种方式。此外,您不必以旧的方式添加库,实际上使用@import
的速度更快,效率更高。如果你仍然期待一个很好的参考,我会强烈推荐你阅读this article。
很高兴回答您可以在本书的学习可可找到的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.h
和SomeFileB.h
;包括SomeFileB.h
和SomeFileB.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
声明而不用担心。
在我的项目(Xcode 6)中,我没有选择启用Xcode 4以启用模块。我可以手动添加它吗? –
构建目标是iOS 6,我认为这是问题 –
看来,因为的XCode 7.xa很多警告的是走出来CLANG_ENABLE_MODULES
启用时铛模块在Lots of warnings when building with Xcode 7 with 3rd party libraries
是的,我也有这个问题,但将其设置为NO会删除所有警告。当我这样做时会有副作用吗? – satheeshwaran
http://stackoverflow.com/questions/29701647/use-看看当模块被禁用进口时 –
http://stackoverflow.com/questions/29701647/use-of-import-when-modules-are-disabled –