您的位置:首页 > 其它

@import Modules机制

2015-10-08 16:50 253 查看
Modules机制是iOS7 xcode5 的新特性。查看了一下相关资料在这里记录一下。

从#include到Modules

#include

优点:学习过C语言应该不会陌生,导入头文件。使得开发方便很多。#include 就是简单的复制粘贴到该文件,例如在Test.h文件中调用#include< Test1.h> 就是将Test1.h中的内容复制粘贴到Test.h中。

缺点:#include简单的复制粘贴,使用不当会带来很多问题。

比如B和C都引用了A,D又同时引用了B和C,这样A中定义的东西就在D中被定义了两次,重复定义相同的东西是错误的。

#import

优点:#import 是#include的升级,(import的实现是通过#ifndef一个标志进行判断,然后在引入后#define这个标志,来避免重复引用的)解决了#include重复引用的问题。

缺点:如果一个文件被其他多个文件文件引用,比如A文件被A1,A2,A3…… (100)个文件引用,因为#include 和#import是复制粘贴,所以A文件被复制粘贴了100 次 ,代码大量增加。在编译的时候也要编译100次。编译速度被拖慢。

预编译处理

优点:C语言中使用预编译处理来解决上面的问题。把被大量引用 的文件进行预编译处理,这样在整个工程编译时,直接将预编译好的文件导入到引用文件中,解决了编译速度慢的问题。iOS 工程中的.pch文件就是采用了预编译处理。

缺点:于是理论上说,想要提高编译速度,可以把所有头文件引用都放到pch中。但是这样面临的问题是在工程中随处可用本来不应该能访问的东西,而编译器也无法准确给出错误或者警告,无形中增加了出错的可能性。

Modules

Modules相当于将框架进行了封装,然后加入在实际编译之时加入了一个用来存放已编译添加过的Modules列表。如果在编译的文件中引用到某个Modules的话,将首先在这个列表内查找,找到的话说明已经被加载过则直接使用已有的,如果没有找到,则把引用的头文件编译后加入到这个表中。这样被引用到的Modules只会被编译一次,但是在开发时又不会被意外使用到,从而同时解决了编译时间和引用泛滥两方面的问题。

关于普通开发者使用的这个新特性的方法,Apple在LLVM5.0(也就是Xcode5带的最新的编译器前端中)引入了一个新的编译符号@import,使用@符号将告诉编译器去使用Modules的引用形式,从而获取好处,比如想引用MessageUI,可以写成

@import MessageUI;


在使用上,这将等价于以前的#import

@import MessageUI.MFMailComposeViewController;


当然,如果对于以前的工程,想要使用新的Modules特性,如果要把所有头文件都这样一个一个改成@import的话,会是很大的一个工作量。Apple自然也考虑到了这一点,于是对于原来的代码,只要使用的是iOS7或者MacOS10.9的SDK,在Build Settings中将Enable Modules(C and Objective-C)打开,然后保持原来的#import写法就行了。是的,不需要任何代码上的改变,编译器会在编译的时候自动地把可能的地方换成Modules的写法去编译的。

Autolinking是Modules的附赠小惊喜,因为在module定义的时候指定来link framework,所以在编译module时LLVM会将所涉及到的框架自动帮你写到link里去,不再需要到编译设置里去添加了。

本文为读书笔记,在作者基础上加了自己的理解,相关的详细的操作请看原作者文章,感谢作者分享

/article/9385638.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: