Xcode 编译相关

#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 寻找其相关路径

参考于美团技术文章:一款可以让大型iOS工程编译速度提升50%的工具 - 美团技术团队 (meituan.com)

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容