我正在玩一些新的iOS 7功能,并处理一些图像效果,如在WWDC视频“在iOS上实现参与UI”中讨论的那样。为了在会话源代码中产生模糊效果,UIImage通过一个类别进行扩展,该类别导入UIKit,如下所示:
@import UIKit;我想我在另一段视频里看到了一些关于这个的东西,但是我很难找到它。我在找关于什么时候使用这个的背景信息。它只能与苹果框架一起使用吗?使用此编译器指令的好处是否足以使我返回并更新旧代码?
发布于 2013-09-22 18:59:23
这是一个名为Modules或“语义导入”的新特性。在WWDC 2013视频中有更多关于会话205和404的信息。这是预编译头的更好的实现。您可以使用iOS 7和Maverick中的任何系统框架中的模块。模块是框架可执行文件及其头的打包,并被吹捧为比#import更安全和更高效。
使用@import的最大优点之一是不需要在项目设置中添加框架的,它是自动完成的。这意味着您可以跳过单击加号按钮并搜索框架(黄金工具箱)的步骤,然后将其移动到“框架”组。它将拯救许多开发人员从神秘的“链接错误”消息。
实际上您不需要使用@import 关键字.,如果您选择使用模块,则所有#import和#include指令都被映射为自动使用@import。这意味着您不必更改源代码(或从其他地方下载的库的源代码)。据说,使用模块也会提高构建性能,特别是如果您还没有很好地使用PCH,或者您的项目有许多小的源文件。
模块是为大多数苹果框架(UIKit、MapKit、GameKit等)预先构建的.您可以在自己创建的框架中使用它们:如果在Xcode中创建Swift框架,它们将自动创建,并且您可以手动为任何苹果或第三方图书馆创建一个“任何苹果或第三方图书馆”文件。
您可以使用代码完成来查看可用框架的列表:

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

您必须使用Xcode 5和iOS 7或Mavericks,但是您仍然可以为较旧的OSs发布版本(比如iOS 4.3或其他什么)。模块不会更改代码的构建方式或任何源代码。
来自WWDC的幻灯片:
#define readonly 0x01)影响的影响显式使用模块:
将#import <Cocoa/Cocoa.h>替换为@import Cocoa;
您还可以使用以下符号导入一个标头:
@import iAd.ADBannerView;在Xcode中为您自动完成子模块。
发布于 2014-07-27 19:26:48
你可以在“目标-C学习可可”一书中找到很好的答案(ISBN: 978-1-491-90139-7)
模块是将文件和库包含并链接到项目中的一种新方法。为了了解模块是如何工作的以及它们有什么好处,当您想要包含一个文件供使用时,回顾Objective和#import语句的历史是很重要的,您通常会有一些代码如下所示:
#import "someFile.h"或者就框架而言:
#import <SomeLibrary/SomeFile.h>因为Objective是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框架自动链接到项目中的额外好处。模块还允许您只将真正需要的组件包含到项目中。例如,如果您想在AwesomeObject框架中使用AwesomeLibrary组件,通常您必须导入所有的东西才能使用这个整体。但是,使用模块,只需导入要使用的特定对象:
@import AwesomeLibrary.AwesomeObject;对于在Xcode 5中生成的所有新项目,默认情况下都启用模块。如果您想在旧的项目中使用模块(您确实应该这样做),则必须在项目的构建设置中启用它们。一旦这样做,您就可以在代码中一起使用#import和@import语句,而无需担心。
发布于 2013-11-15 13:18:41
它目前只适用于内置的系统框架。如果您像苹果一样使用#import,仍然会在应用程序委托中导入UIKit框架,那么它将被替换(如果模块已经打开,并且它被确认为一个系统框架),编译器将把它重新映射为模块导入,而不是导入头文件。因此,如果可能的话,离开#import将与其转换为模块导入相同。
https://stackoverflow.com/questions/18947516
复制相似问题