@import VS#进口 - 的iOS 7@import VS#进口 - 的iOS 7(@impo

2019-05-08 19:51发布

我玩弄了一些新的iOS 7的功能和一些在WWDC的视频“在iOS上实现引人入胜的UI”讨论的图像效果的工作。 用于制造用于所述会话的源代码内的模糊效果, UIImage经由其中进口的UIKit像这样一类扩展:

@import UIKit;

我觉得我看到了一些关于这在另一个会话视频,但我无法找到它。 我正在寻找的时候使用这个任何背景信息。 可以只与苹果的框架中使用? 使用此编译器指令不够,我应该回去和更新旧代码的好处是什么?

Answer 1:

这是一个被称为模块或“语义进口”的新功能。 有一个在更多信息WWDC 2013会话视频205和404 。 这是一种更好的实现预编译头的。 您可以在iOS的7和小牛队使用的模块与任何系统框架。 模块是一个包装框架可执行在一起,它的头和被吹捧为更安全,效率比#import

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

你实际上并不需要使用@import关键字。 如果您选择在使用的模块,所有#import#include指令被映射到使用@import自动。 这意味着,你不必改变你的源代码(或从其他地方下载库的源代码)。 据说使用模块提高了构建性能也一样,特别是如果你还没有使用PCHS好,或者如果你的项目有很多小源文件。

模块是预建的大多数苹果框架(UIKit中,MapKit,的GameKit等)。 你可以用它们与框架,创建自己:如果您在Xcode中创建一个斯威夫特框架会自动创建的,并且可以手动创建一个“.modulemap”文件,自己的任何苹果或第三方库 。

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

模块默认情况下,在新的项目在Xcode 5启用 。 为了使他们能够在更早的项目,进入你的项目构建设置,搜索“模块”,并设置了“启用模块”为“YES”。 “链接框架”应该是“YES”太:

你要使用的Xcode 5和iOS的7或小牛SDK,但你仍然可以释放的旧式OS(iOS版说4.3或其他)。 模块不改变你的代码是如何构建或者任何的源代码。


从WWDC幻灯片:

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

要明确使用的模块:

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

你也可以用这个符号只导入一个标题:

@import iAd.ADBannerView;

该子模块在Xcode自动完成你。



Answer 2:

尼斯的答案,你可以在本书的学习可可找到的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 ; 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没有任何关注你的代码语句一起。



Answer 3:

它目前只适用于内置的系统框架。 如果您使用#import喜欢苹果还是进口UIKit在它取代了应用程序委托框架(如模块是其公认的体系架构)和编译器会重新映射这是一个模块的进口,而不是的进口反正头文件。 所以离开#import将是一样的作为其转换为一个模块导入在可能的情况呢



Answer 4:

看来,因为的XCode 7.xa很多警告的是走出来使铛模块时CLANG_ENABLE_MODULES

看看在Xcode 7号楼与第三方库时警告地段



Answer 5:

有使用模块的一些好处。 您只能使用苹果的框架使用它,除非是创建的模块图。 @import有点类似加时进行预编译头文件.pch文件,该文件是调整应用程序的方式编译过程。 此外,您不必添加库以旧的方式,使用@import其实更快,效率更高。 如果你仍然找一个很好的参考,我会强烈建议你阅读这篇文章 。



文章来源: @import vs #import - iOS 7