#import
#include任务是将.h文件全部拷贝到当前文件,并替换这句#include
#import改进,在#include的基础上多了一个能够避免头文件重复引用的功能
pch
原理
- 编译.m文件前,编译器对PCH内容进行预编译,将其变成二进制中间格式缓存
- 编译.m文件时,如果需要PCH里的内容,直接读取,无须再次编译
缺点
- 梳理清楚引用关系麻烦
- 引发命名空间被污染的问题
- 一个庞大的Prefix Header会增加Build耗时
module
是啥?
理解为一种对组件的描述,包含接口和实现的描述。
同时 Module 的产物是被独立编译出来的,不同的 Module 之间是不会影响的。
被引用的Module只会被编译一次,且在运行过程中不会相互影响。
目的
解决与传统#include和#import机制相关的问题
原理
如果在编译中的文件中引用到某个Module,系统将优先在这个列表内查找是否存在对应的中间产物,如能找到,则说明文件已经被编译过,直接使用;
如果没找到则把引用到的头文件进行编译,并将产物添加到相应的空间中以备重复使用。
使用
Build setting 中设置 Enable Module 设置为YES
自定义组件需要设置Defines Model 设置为YES
@import iAd;
同 #import <iAd/iAd.h>
@import iAd.ADBannerView
同 #import <iAd/ADBannerView.h.h>
编译器能够将符合某种格式的#import 语句自动转换成Modul识别的@import语句
#import <UIKit/UIKit.h>
-> @import UIKit;
优点
虽然这种引入方式和之前的写法区别不大,但它们在本质上还是有很大程度的不同,module 不会“复制粘贴”头文件里的内容,也不会让 @import 所暴露的 API 被开发者本地的上下文篡改
Header map
是啥?
二进制文件,包含头文件和头文件路径的映射表
核心功能:
是让编译器能够找到相应的头文件的位置,相较于使用header search path提供的路径查找会快很多
开启方法:
build setting 中 Use Header Map 设为YES
工作方式
一旦开启Use Header Map选项后,Xcode会优先去hmap映射表里找头文件路径;
找不到的情况去header search path中提供的路径遍历搜索
cocoapods命中问题
Static Library
头文件类型都为Project类型 hmap中只会包含#import “A.h”
的键值引用 ,只有#import “A.h”
才能命中hmap,否则通过Header Search Path 寻找其相关路径