ios-@import和#import

在Xcode5以后,我们就可以不用再去在如下图所示的的Linked Frameworks and Libraries中去显式的添加frameword了

ios-@import和#import_第1张图片

Xcode5以后有三个新东西modules、AutoLinking和@import,原本我们之前导入头文件都是使用#import,这个就是和include的作用差不多就是相当于把头文件的内容复制过来,然后把本身的#import的头文件那句话给替换掉。但是#import比#include进步的一点就是能减少重复引用了,比如说你在A.h文件中#import C.h,B.h中也#import C.h,然后你在D.h文件中#import A.h #import B.h,是不会有关于C.h文件重复引用的问题的。具体的方法是通过#ifndef也就是条件编译来实现。

在苹果没有推出Modules的时候,我们如果写的程序比较复杂的话,我们#import了很多相同的头文件,这样会很麻烦,而且编译速度慢,所以苹果有一个pch文件可以帮助我们解决,但是放在pch的头文件,虽然提高编译速度,在整个工程中都能访问,这样终归不好。pch文件其实就是采用了预编译处理,当在Build Setting中的Precompile Prefix Header为YES,把一些公用的头文件放入预编译头文件中预先进行编译,然后在真正编译工程时再将预先编译好的产物加入到所有还没编译的文件中去,以此来加快编译速度。

一个完整的编译过程如下所示

1.预处理(Pre-process):把宏替换,删除注释,展开头文件,产生 .i 文件
2.编译(Compliling):把之前的 .i 文件转换成汇编语言,产生 .s文件
3.汇编(Asembly):把汇编语言文件转换为机器码文件,产生 .o 文件
4.链接(Link):对.o文件中的对于其他的库的引用的地方进行引用,生成最后的可执行文件(同时也包括多个 .o 文件进行 link)

所以苹果推出了Modules,Modules相当于将框架进行了封装,然后加入在实际编译之时加入了一个用来存放已编译添加过的Modules列表。如果在编译的文件中引用到某个Modules的话,将首先在这个列表内查找,找到的话说明已经被加载过则直接使用已有的,如果没有找到,则把引用的头文件编译后加入到这个表中。这样被引用到的Modules只会被编译一次,而且在开发的时候也不存在整个工程都能去访问了。又可以提高编译速度。

在Xcode5之后,是默认开启了modules的,我们如果使用#import,Xcode会帮我们自动映射成@import,所以我们可以不用手动的去导入框架了。自动做的配置如下图所示

这其中其实就是@import通过AutoLinking,Xcode的编译器LLVM会在编译阶段将所涉及到的框架自动帮你写到link里,不需要在build phases里手动添加了。

ios-@import和#import_第2张图片


你可能感兴趣的:(ios-开发)