一、開發(fā)環(huán)境
1、什么是LLVM和Clang?
LLVM 全稱 Low Level Virtual Machine ,底層虛擬機,
宏觀:LLVM不僅是一個編譯器或者虛擬機,它是一個眾多編譯器工具及低級工具技術(shù)的統(tǒng)稱,包含一個前端、優(yōu)化器、后端以及眾多函數(shù)庫和模板。
微觀:可以看做后端編譯器,前端編譯器為Clang。
Clang是一個有C++編寫的編譯器前端,能夠編譯C、C++、Objc等高級語言,屬于LLVM的一部分。主要用于詞法分析、語法分析、語義分析、生成中間代碼。
2、Clang與GCC有什么區(qū)別?
(1)Clang比Gcc編譯用時更短
(2)Clang比Gcc占用內(nèi)存更小
(3)Clang生成的中間產(chǎn)物比Gcc更小
(4)Clang錯誤提示比Gcc更友好
(5)Clang有靜態(tài)分析,Gcc沒有
(6)Clang從開始就被設(shè)計為API,允許代碼分析工具和IDE集成
(7)Gcc比Clang支持更多語言和平臺
3、Clang如何使用?
Clang功能非常強大,可以通過Clang觀察到編譯器運行的幾個階段:
(1)詞法分析
(2)語法分析
(3)生成抽象語法樹(AST)
(4)生成中間代碼(IR)
(5)編譯器優(yōu)化
(6)生成目標文件
(7)運行目標文件
經(jīng)常使用Clang將Objc代碼轉(zhuǎn)化成C++代碼:
clang -rewrite-objc main.m//將oc->c++
4、Xcode項目中target和scheme的區(qū)別是什么?
target包含了所有的源文件,決定編譯那些文件,一個project可以包含一個或者多個target。
scheme定義了一個target集合,決定運行和構(gòu)建哪個target。
5、CocoaPods的工作原理是什么?
(1)通過建立podfile文件,指定第三方庫
(2)使用pod install安裝框架
(3)第三方框架被編譯為libpods.a的靜態(tài)庫,主項目依賴這個靜態(tài)庫
二、常用框架
1、Cocoa,F(xiàn)oundation和UIKit的區(qū)別是什么?
Cocoa是一個框架集合,包含了眾多子框架,其中最核心的兩個框架就是Foundation和UIKit。
Foundation是最常用的基礎(chǔ)框架,包含了數(shù)據(jù)類型,枚舉,結(jié)構(gòu)體等所有與UI界面沒有直接關(guān)系的類,這些類的根類為NSObject,所以使用“NS”作為前綴。
UIKit是簡歷在Foundation框架上的,用于界面繪制和管理界面的框架,提供一系列的類來管理用戶界面、事件捕捉、圖形繪制、屏幕觸碰等接口。使用“UI”作為前綴。
2、Cocoa,F(xiàn)oundation和UIKit的區(qū)別是什么?
Foundation是最常用的基礎(chǔ)框架,包含了,數(shù)據(jù)類型、枚舉、結(jié)構(gòu)體等與UI無關(guān)的類,常見類:NSString,NSArray。。。是由Objective-C實現(xiàn)的。
Core Foundation是從Foundation框架派生出來的,由C語言實現(xiàn)的框架。常見類:CFString,CFArray。。。
兩套框架具有相同的功能,提供了兩套接口,只是實現(xiàn)語言不一樣。兩者之間可以通過 __bridge,__bridge_transfer,__bridge_retain等關(guān)鍵字來轉(zhuǎn)換橋接。
為什么有兩套。主要是為了易于實現(xiàn)跨平臺開發(fā)和支持開發(fā)國際化。
三、其他
1、什么是懶加載(lazy loading)?
懶加載有成為“延遲加載”,核心思想就是把對象的實例化延遲到真正調(diào)用該對象時進行,好處是減輕大量對象在實例化時對資源的消耗,而不是在程序初始化時就預先將對象實例化。另外,懶加載可以將實例化代碼從初始化函數(shù)中獨立出來,提高代碼可讀性,以便于代碼更好的被組織。
2、iOS中動態(tài)庫和靜態(tài)庫的區(qū)別是什么?
(1)存在形式上:靜態(tài)庫已.a或者.framework為文件后綴,動態(tài)庫以.dylib或者.framework為文件后綴。
(2)使用區(qū)別上:靜態(tài)庫鏈接時,被完整的復制到可執(zhí)行文件中,動態(tài)庫鏈接時,不復制,程序運行時由系統(tǒng)動態(tài)加載到內(nèi)存,供程序調(diào)用,當多個程序共同調(diào)用時,只加載一次,以節(jié)省內(nèi)存開銷。