一、开发环境
1、什么是LLVM和Clang?
LLVM 全称 Low Level Virtual Machine ,底层虚拟机,
宏观:LLVM不仅是一个编译器或者虚拟机,它是一个众多编译器工具及低级工具技术的统称,包含一个前端、优化器、后端以及众多函数库和模板。
微观:可以看做后端编译器,前端编译器为Clang。
Clang是一个有C++编写的编译器前端,能够编译C、C++、Objc等高级语言,属于LLVM的一部分。主要用于词法分析、语法分析、语义分析、生成中间代码。
2、Clang与GCC有什么区别?
(1)Clang比Gcc编译用时更短
(2)Clang比Gcc占用内存更小
(3)Clang生成的中间产物比Gcc更小
(4)Clang错误提示比Gcc更友好
(5)Clang有静态分析,Gcc没有
(6)Clang从开始就被设计为API,允许代码分析工具和IDE集成
(7)Gcc比Clang支持更多语言和平台
3、Clang如何使用?
Clang功能非常强大,可以通过Clang观察到编译器运行的几个阶段:
(1)词法分析
(2)语法分析
(3)生成抽象语法树(AST)
(4)生成中间代码(IR)
(5)编译器优化
(6)生成目标文件
(7)运行目标文件
经常使用Clang将Objc代码转化成C++代码:
clang -rewrite-objc main.m//将oc->c++
4、Xcode项目中target和scheme的区别是什么?
target包含了所有的源文件,决定编译那些文件,一个project可以包含一个或者多个target。
scheme定义了一个target集合,决定运行和构建哪个target。
5、CocoaPods的工作原理是什么?
(1)通过建立podfile文件,指定第三方库
(2)使用pod install安装框架
(3)第三方框架被编译为libpods.a的静态库,主项目依赖这个静态库
二、常用框架
1、Cocoa,Foundation和UIKit的区别是什么?
Cocoa是一个框架集合,包含了众多子框架,其中最核心的两个框架就是Foundation和UIKit。
Foundation是最常用的基础框架,包含了数据类型,枚举,结构体等所有与UI界面没有直接关系的类,这些类的根类为NSObject,所以使用“NS”作为前缀。
UIKit是简历在Foundation框架上的,用于界面绘制和管理界面的框架,提供一系列的类来管理用户界面、事件捕捉、图形绘制、屏幕触碰等接口。使用“UI”作为前缀。
2、Cocoa,Foundation和UIKit的区别是什么?
Foundation是最常用的基础框架,包含了,数据类型、枚举、结构体等与UI无关的类,常见类:NSString,NSArray。。。是由Objective-C实现的。
Core Foundation是从Foundation框架派生出来的,由C语言实现的框架。常见类:CFString,CFArray。。。
两套框架具有相同的功能,提供了两套接口,只是实现语言不一样。两者之间可以通过 __bridge,__bridge_transfer,__bridge_retain等关键字来转换桥接。
为什么有两套。主要是为了易于实现跨平台开发和支持开发国际化。
三、其他
1、什么是懒加载(lazy loading)?
懒加载有成为“延迟加载”,核心思想就是把对象的实例化延迟到真正调用该对象时进行,好处是减轻大量对象在实例化时对资源的消耗,而不是在程序初始化时就预先将对象实例化。另外,懒加载可以将实例化代码从初始化函数中独立出来,提高代码可读性,以便于代码更好的被组织。
2、iOS中动态库和静态库的区别是什么?
(1)存在形式上:静态库已.a或者.framework为文件后缀,动态库以.dylib或者.framework为文件后缀。
(2)使用区别上:静态库链接时,被完整的复制到可执行文件中,动态库链接时,不复制,程序运行时由系统动态加载到内存,供程序调用,当多个程序共同调用时,只加载一次,以节省内存开销。