iOS中#import 、@import、#include的区别
#import 、@import、#include
都是为了引用头文件被创造出来的。
在C和C++里是没有#import
的,只有#include
用来包含头文件。#include
就是将目标.h文件中的内容拷贝到当前文件中,并替换掉这句include。
但是这样做可能会因为重复引用带来编译错误,比如B和C都引用了A,D又同时引用了B和C,这样D引用了A两次。为了解决这个问题,OC加入了#import,就是为了使得头文件只被引用一次。其原理是通过
#ifndef xxx
#define xxx
来实现的。
问题来了:当引用关系很复杂时,编译引用所占的代码量就会大幅上升,因为被引用的头文件在引用的地方都被拷贝了一次。
为了解决这个问题,C语言引入了预编译头文件(PreCompiled Header),将公用的头文件放入预编译头文件中预先进行编译,然后在真正编译工程时再将预先编译好的产物加入到所有待编译的Source中去,来加快编译速度。
问题又来了:理论上说,想要提高编译速度,可以把所有头文件引用都放到pch文件中。但是这样面临的问题是在工程中随处都能访问可能不该访问的东西,这样的结果显然不是很理想的。
于是苹果创造了Modules来解决这个问题,而使用的方式就是@import
。
Modules会在实际编译时加入了一个用来存放已编译添加过的Modules列表。首先在Modules列表内查找,如果在编译的文件中引用到某个Module,则直接使用;如果没有,则把引用的头文件编译后加入到这个表中。这样被引用到的Modules只会被编译一次,也避免了在工程中随处都能访问可能不该访问的东西。
思考:Modules的引入有没有什么缺陷呢?
总结
因为需要,某种事物被创造出来。但开始可能并不完美,为了解决问题,就会引入新的东西,而新的东西可能依然会存在缺陷,这样就会又有新的东西出现,直到问题完美解决。
第一次写文章,有不周到的地方还请指正。