我正在研究iOS 7的一些新功能,并使用WWDC视频“在iOS上实现吸引人的UI”中讨论过的一些图像效果。为了在会话的源代码中产生一个模糊的效果,UIImage通过导入UIKit的category进行了扩展:

@import UIKit;

我想我在另一个视频中看到了一些关于这个的东西,但我很难找到它。我在找什么时候使用这个的背景资料。它只能用于苹果框架吗?使用这个编译器指令的好处是否足够让我回去更新旧代码?


当前回答

@import模块(ObjC)或语义导入

而不是通常的模块使用

//as example
#include <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

历史:

[#include -> #import] ->[预编译Headers .pch] -> @import模块(ObjC);-> [import Module(Swift)]

它是LLVM模块的一部分

@ import < module_name >;声明告诉编译器加载(而不是编译)预编译的模块二进制文件,这减少了构建时间。以前编译器编译依赖每次当runt进入它,但现在它应该事先编译,只是加载

//previously
run into dependency -> compile dependency
run into dependency -> compile dependency

//@import
compile dependency 
    run into dependency -> load compiled binary
    run into dependency -> load compiled binary

[Modulemap] -模块和头文件之间的桥梁

Xcode

启用模块(C和Objective-C)(CLANG_ENABLE_MODULES) - clang# include, #import指令自动转换为@import,带来所有优势。Modulemap允许无缝完成,因为它包含了头文件和子/模块之间的映射

当心 - fmodules

#include, #import -> @import

自动链接框架(CLANG_MODULES_AUTOLINK) -允许系统模块自动链接。需要激活CLANG_ENABLE_MODULES。自动链接允许传递-framework <framework_name>基于#import, @import(Objective-C), import(Swift)

如果NO -传递-fno-autolink标志

CLANG_ENABLE_MODULES == NO和CLANG_MODULES_AUTOLINK == NO

如果你想手动处理system(#import <UIKit/UIKit.h>)链接(而不是自动链接),你有两个变量:

在General ->框架和库或框架、库和嵌入式内容中添加依赖项 构建设置->其他连接器标志(OTHER_LDFLAGS) -> -framework <module_name> . Build Settings

下一个错误将被抛出,如果:

Undefined symbol: _OBJC_CLASS_$_UIView

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_UIView", referenced from:
      objc-class-ref in ClassB.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1

CLANG_ENABLE_MODULES被禁用 CLANG_MODULES_AUTOLINK被禁用,没有手动链接

逆向工程

otool -l <binary> 
//-l print the load commands
//find LC_LINKER_OPTION
//cmd LC_LINKER_OPTION

其他回答

这是一个叫做模块或“语义导入”的新特性。在WWDC 2013的205和404会议视频中有更多的信息。这是预编译头文件的更好实现。你可以在iOS 7和Mavericks中的任何系统框架中使用模块。模块是框架可执行文件及其头文件的打包,被吹捧为比#import更安全、更高效。

使用@import的最大优势之一是你不需要在项目设置中添加框架,它是自动完成的。这意味着您可以跳过单击加号按钮并搜索框架(黄金工具箱)的步骤,然后将其移动到“框架”组。它将使许多开发人员从神秘的“链接器错误”消息中解脱出来。

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

模块是为大多数苹果框架(UIKit, MapKit, GameKit等)预先构建的。你可以在你自己创建的框架中使用它们:如果你在Xcode中创建一个Swift框架,它们会自动创建,你可以手动创建一个“。modulemap”文件自己的任何苹果或第三方库。

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

在Xcode 5的新项目中,模块默认是启用的。要在旧项目中启用它们,进入您的项目构建设置,搜索“模块”并将“启用模块”设置为“YES”。“Link Frameworks”也应该是“YES”:

你必须使用Xcode 5和iOS 7或Mavericks SDK,但你仍然可以发布旧的操作系统(比如iOS 4.3或其他)。模块不会改变代码的构建方式或任何源代码。


来自WWDC的幻灯片:

导入框架的完整语义描述 不需要解析头文件 导入框架接口的更好方法 加载二进制表示 比预编译头文件更灵活 不受本地宏定义的影响(例如#define readonly 0x01) 默认为新项目启用


要显式地使用模块:

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

你也可以用下面的符号只导入一个头文件:

@import iAd.ADBannerView;

子模块在Xcode中自动完成。

它目前只适用于内置的系统框架。如果你使用#import,就像苹果仍然在应用委托中导入UIKit框架一样,它会被替换(如果modules是打开的,并且它被识别为系统框架),编译器将重新映射它为模块导入,而不是头文件的导入。 因此,在可能的情况下,保留#import将与它转换为模块导入相同

似乎自从XCode 7。在CLANG_ENABLE_MODULES中启用clang模块时,会出现很多警告

看看在Xcode 7中使用第三方库构建时的大量警告

@import模块(ObjC)或语义导入

而不是通常的模块使用

//as example
#include <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

历史:

[#include -> #import] ->[预编译Headers .pch] -> @import模块(ObjC);-> [import Module(Swift)]

它是LLVM模块的一部分

@ import < module_name >;声明告诉编译器加载(而不是编译)预编译的模块二进制文件,这减少了构建时间。以前编译器编译依赖每次当runt进入它,但现在它应该事先编译,只是加载

//previously
run into dependency -> compile dependency
run into dependency -> compile dependency

//@import
compile dependency 
    run into dependency -> load compiled binary
    run into dependency -> load compiled binary

[Modulemap] -模块和头文件之间的桥梁

Xcode

启用模块(C和Objective-C)(CLANG_ENABLE_MODULES) - clang# include, #import指令自动转换为@import,带来所有优势。Modulemap允许无缝完成,因为它包含了头文件和子/模块之间的映射

当心 - fmodules

#include, #import -> @import

自动链接框架(CLANG_MODULES_AUTOLINK) -允许系统模块自动链接。需要激活CLANG_ENABLE_MODULES。自动链接允许传递-framework <framework_name>基于#import, @import(Objective-C), import(Swift)

如果NO -传递-fno-autolink标志

CLANG_ENABLE_MODULES == NO和CLANG_MODULES_AUTOLINK == NO

如果你想手动处理system(#import <UIKit/UIKit.h>)链接(而不是自动链接),你有两个变量:

在General ->框架和库或框架、库和嵌入式内容中添加依赖项 构建设置->其他连接器标志(OTHER_LDFLAGS) -> -framework <module_name> . Build Settings

下一个错误将被抛出,如果:

Undefined symbol: _OBJC_CLASS_$_UIView

Undefined symbols for architecture x86_64:
  "_OBJC_CLASS_$_UIView", referenced from:
      objc-class-ref in ClassB.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1

CLANG_ENABLE_MODULES被禁用 CLANG_MODULES_AUTOLINK被禁用,没有手动链接

逆向工程

otool -l <binary> 
//-l print the load commands
//find LC_LINKER_OPTION
//cmd LC_LINKER_OPTION

使用模块有几个好处。除非创建了模块映射,否则只能在Apple框架中使用它。@import有点类似于在添加到.pch文件时预编译头文件,这是一种调整应用程序编译过程的方法。此外,您不必以旧的方式添加库,使用@import实际上更快更有效。如果你还在寻找一个好的参考,我强烈推荐你阅读这篇文章。