@import vs #import
我正在玩弄一些新的iOS 7功能,并与WWDC视频“在iOS上实现使用UI”中讨论的一些图像效果一起工作。 为了在会话的源代码中产生模糊效果, UIImage
通过导入UIKit的类来扩展,如下所示:
@import UIKit;
我想我在另一个会话视频中看到了一些关于此的内容,但我无法找到它。 我正在寻找任何有关何时使用此功能的背景信息。 它只能用于Apple框架吗? 使用此编译器指令的好处是否足以让我回去更新旧代码?
这是一个称为模块或“语义导入”的新功能。 有关会话205和404的WWDC 2013视频中有更多信息,这是预编译头文件的更好实现。 您可以将模块与iOS 7和Mavericks中的任何系统框架一起使用。 模块是框架可执行文件和头文件的封装,并被吹捧为比#import
更安全和更高效。
使用@import
一大优点是, 您不需要在项目设置中添加框架,它会自动完成 。 这意味着您可以跳过单击加号按钮并搜索框架(金色工具箱)的步骤,然后将其移至“框架”组。 它可以节省许多开发人员的神秘“链接器错误”消息。
您实际上并不需要使用@import
关键字。 如果您选择使用模块,则所有#import
和#include
指令都将自动映射为使用@import
。 这意味着您不必更改源代码(或从其他位置下载的库的源代码)。 假设使用模块也会提高构建性能,尤其是如果您没有很好地使用PCH,或者您的项目有许多小型源文件。
模块是为大多数Apple框架(UIKit,MapKit,GameKit等)预先构建的。 您可以将它们与您自己创建的框架一起使用:如果您在Xcode中创建Swift框架,它们会自动创建,并且您可以手动为任何Apple或第三方库自行创建一个“.modulemap”文件。
您可以使用代码完成来查看可用框架的列表:
Xcode 5中的新项目默认启用模块 。 要在较旧的项目中启用它们,请进入项目构建设置,搜索“模块”并将“启用模块”设置为“是”。 “链接框架”也应该是“YES”:
你必须使用Xcode 5和iOS 7或Mavericks SDK,但你仍然可以发布适用于较老的操作系统(比如iOS 4.3或其他)。 模块不会改变您的代码的构建方式或任何源代码。
来自WWDC幻灯片:
#define readonly 0x01
) 要明确使用模块:
用@import Cocoa;
替换#import <Cocoa/Cocoa.h>
@import Cocoa;
你也可以用这个表示法只导入一个头文件:
@import iAd.ADBannerView;
Xcode中的子模块自动完成。
你可以在Objective-C学习Cocoa的书中找到很好的答案(ISBN:978-1-491-90139-7)
模块是将文件和库链接到项目中的新手段。 为了理解模块是如何工作的以及它们有什么好处,重新回顾Objective-C和#import语句的历史非常重要当您想要包含要使用的文件时,您通常会看到如下代码:
#import "someFile.h"
或者在框架的情况下:
#import <SomeLibrary/SomeFile.h>
因为Objective-C是C编程语言的超集,#import语句是对C的#include
语句的细微修改。 #include语句非常简单; 它会在编译过程中将包含文件中发现的所有内容复制到您的代码中。 这有时会导致重大问题。 例如,假设你有两个头文件: SomeFileA.h
和SomeFileB.h
; SomeFileA.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
语句,而不用担心。
它目前仅适用于内置的系统框架。 如果您使用#import
像苹果,仍然在应用程序委托中导入UIKit
框架,它会被替换(如果模块处于打开状态并且它被识别为系统框架),编译器会将其重新映射为模块导入,而不是导入无论如何,头文件。 因此,如果可能的话,将#import
与其转换为模块导入的方式相同
上一篇: @import vs #import