@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.hSomeFileB.h ; SomeFileA.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语句,而不用担心。


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

    链接地址: http://www.djcxy.com/p/47383.html

    上一篇: @import vs #import

    下一篇: Cocoa: Break on every method call?