我正在使用一些新的iOS 7功能,并使用WWDC视频"在iOS上实现吸引人的用户界面"中讨论的一些图像效果。为了在会话的源代码中产生模糊效果,UIImage通过导入uikit的类别进行了扩展,如下所示:
我想我在另一个视频中看到了一些关于这个的东西,但是我找不到它。我在找什么时候用这个的背景资料。它只能用于Apple框架吗?使用这个编译器指令的好处是否足以让我返回并更新旧代码?
- stackoverflow.com/questions/29701647/…
- stackoverflow.com/questions/29701647/…
这是一个称为模块或"语义导入"的新功能。WWDC 2013视频中有205和404部分的更多信息。它是预编译头的一种更好的实现。您可以将模块与iOS 7和Mavericks中的任何系统框架一起使用。模块是框架可执行文件和它的头文件的打包,被吹捧为比#import更安全、更高效。
使用@import的一个主要优点是不需要在项目设置中添加框架,它是自动完成的。这意味着您可以跳过单击加号按钮并搜索框架(黄金工具箱)的步骤,然后将其移动到"框架"组。它将从神秘的"链接器错误"消息中节省许多开发人员。
您实际上不需要使用@import关键字。如果您选择使用模块,那么所有#import和#include指令都会自动映射为使用@import。这意味着您不必更改源代码(或从其他地方下载的库的源代码)。假设使用模块也可以提高构建性能,特别是如果您没有很好地使用PCH或者您的项目有许多小的源文件。
模块是为大多数苹果框架(uikit、mapkit、gamekit等)预先构建的。您可以将它们与您自己创建的框架一起使用:如果您在Xcode中创建一个Swift框架,它们将自动创建,并且您可以为任何Apple或第三方库手动创建一个".modulemap"文件。
您可以使用代码完成来查看可用框架的列表:
在Xcode5的新项目中,模块默认启用。要在旧项目中启用它们,请进入项目生成设置,搜索"模块",并将"启用模块"设置为"是"。"链接框架"也应为"是":
您必须使用Xcode5和iOS7或MavericksSDK,但是您仍然可以为旧的OSS发布(比如iOS4.3或其他)。模块不会改变代码的构建方式或任何源代码。
从WWDC幻灯片:
-
Imports complete semantic description of a framework
-
Doesn't need to parse the headers
-
Better way to import a framework’s interface
-
Loads binary representation
-
More flexible than precompiled headers
-
Immune to effects of local macro definitions (e.g. #define readonly 0x01)
-
Enabled for new projects by default
要显式使用模块:
用@import Cocoa;替换#import 。
您也可以只导入一个带有此符号的标题:
1
| @import iAd.ADBannerView; |
子模块在Xcode中为您自动完成。
- "davedelong &;克拉斯:谢谢!我必须承认我不知道当我第一本关于模块的说。我会去学习它,看着404。该演示是Doug Gregor(LLVM的家伙是真的做的很好了)。也有一个C + +的优势在哪里explains模块的谈话:youtube.com /手表吗?4xo9ih5vlq0 v =
- 谢谢@妮娃-答案。我只是想添加这个组件不支持第三方目前还和自己的框架。
- 你可以使用这个类是您自己?
- 我只是想指出,如果你在它的一个大项目,你要编辑的项目建设目标。没有设置,生成的设置。
- 你可以的"T"urimoai -这与你自己的类使用。
- 万岁!你好,pythonic风格!的:)
- 虽然只是一件事:一是完成自动链接框架的特点,游戏中心或类似的安装程序需要额外的X mapkit在线超链接之前,他们可以给你的,你可以有一个Xcode通过适当的开关打开在你的应用程序为目标的能力。
- 我认为你应该能够导入第三方框架"提供了一module.map,如果适当的。LLVM的铿锵:clang.llvm.org文档/文档/模块的模块图modules.html #语言
- "我想,但能不能bames53的程序库。让我知道如果你得到它的工作与我会更新的答案。
- "你想你的nevanking均写module.map和它不工作?
- 在"bames53,没有这样的。我只是想(@)进出库的程序。我有一个想法如何使的模块图。
- "那我给它nevanking介绍和链接,你可以看看苹果的module.map文件适当的实例。SQLite3是已经发生@import sqlite3已经有操作系统的作品。我想创建一个模块,以我自己的小图书馆和它的工作好。
- "我想bames53 @import sqlite再次,但它给了一个错误。SQLite模块没有发现。
- "nevanking @import sqlite3
- 哦,它看起来像是真的,因为我有我的工作@import sqlite3创造我自己当我意识到它是module.map SQLite是包含在X和删除我的module.map stale继续使用,编译器模块。
- 像什么"nicolasmiari扭在苹果的网站上。点击上面的链接,然后点击「是404,Objective - C的研究进展"的两次音乐会上和它的标题。
- "nevanking对不起,它是仅笑话:404 NOT→发现(知道)?的详细的解释。不过谢谢:)
- 顺便说一下,它是可能的,与现在使用的@import自定义框架已经与他们说(8)。早期的出模角,是不是唯一的目的(或你应该能够使用它与任何语言铿锵compiles是动态和静态库的话,和,虽然后者将需要一些定制的模块lipelling映射。
- 在传统的项目,它的思想和良好的安全#imports去替换所有带@imports吗?
- 然而,实现这个功能的避风港’t!谢谢的答案和相关的视频通过YouTube发现"nevanking /手表吗?4xo9ih5vlq0 v =
你可以在《客观C学习可可》一书中找到一个很好的答案(ISBN:978-1-491-90139-7)
模块是将文件和库包含并链接到项目中的一种新方法。为了了解模块的工作原理和它们有什么好处,回顾一下Objective-C和导入声明的历史是很重要的。每当您想要包含一个文件以供使用时,通常都会有一些代码如下所示:
或者对于框架:
1
| #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更安全。
返回上一个导入框架的示例:
1
| #import <SomeLibrary/SomeFile.h> |
要将此库作为模块导入,代码将更改为:
这增加了Xcode自动将somelibrary框架链接到项目中的额外功能。模块还允许您只将真正需要的组件包含到项目中。例如,如果您想要在awsomelibrary框架中使用awsomeobject组件,那么通常您必须导入所有内容才能使用一个工件。但是,使用模块,您可以只导入要使用的特定对象:
1
| @import AwesomeLibrary.AwesomeObject; |
对于在Xcode5中创建的所有新项目,默认情况下都启用模块。如果要在较旧的项目中使用模块(并且确实应该这样做),则必须在项目的生成设置中启用这些模块。一旦这样做了,您就可以在代码中同时使用#import和@import语句,而不必担心。
- 有一个选项(在我的Xcode项目中6)我先开始在线Xcode 4启用模块。我可以手动添加它,不知何故?
- 他们的目标是建立的智囊机构6,这是我的问题
它目前只适用于内置系统框架。如果你像苹果一样使用#import,仍然在应用程序委托中导入UIKit框架,那么它会被替换(如果模块已打开,并且它被识别为系统框架),编译器会将其重新映射为模块导入,而不是头文件的导入。因此,如果可能的话,离开#import将与转换为模块导入一样。
由于Xcode 7.x在使用CLANG_ENABLE_MODULES启用clang模块时,似乎会发出很多警告。
使用Xcode7和第三方库构建时,请查看大量警告
- 是的,我也有这个问题,但它removes设置在所有的警告。将在那里当一侧的效应吗????????
使用模块有一些好处。除非创建了模块映射,否则只能将其与苹果的框架一起使用。@import与添加到.pch文件时预编译头文件有点相似,这是一种调整应用程序编译过程的方法。此外,您不必以旧的方式添加库,使用@import实际上更快、更高效。如果你仍然在寻找一个很好的参考,我强烈建议你阅读这篇文章。