一眼耀、開發(fā)環(huán)境
1、什么是LLVM和Clang佩憾?
LLVM 全稱 Low Level Virtual Machine 哮伟,底層虛擬機(jī),
宏觀:LLVM不僅是一個編譯器或者虛擬機(jī)妄帘,它是一個眾多編譯器工具及低級工具技術(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功能非常強(qiáng)大达舒,可以通過Clang觀察到編譯器運(yùn)行的幾個階段:
(1)詞法分析
(2)語法分析
(3)生成抽象語法樹(AST)
(4)生成中間代碼(IR)
(5)編譯器優(yōu)化
(6)生成目標(biāo)文件
(7)運(yùn)行目標(biāo)文件
經(jīng)常使用Clang將Objc代碼轉(zhuǎn)化成C++代碼:
clang -rewrite-objc main.m//將oc->c++
4、Xcode項目中target和scheme的區(qū)別是什么叹侄?
target包含了所有的源文件巩搏,決定編譯那些文件,一個project可以包含一個或者多個target趾代。
scheme定義了一個target集合贯底,決定運(yùn)行和構(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實(shí)現(xiàn)的。
Core Foundation是從Foundation框架派生出來的刃鳄,由C語言實(shí)現(xiàn)的框架盅弛。常見類:CFString钱骂,CFArray叔锐。挪鹏。。
兩套框架具有相同的功能愉烙,提供了兩套接口讨盒,只是實(shí)現(xiàn)語言不一樣。兩者之間可以通過 __bridge,__bridge_transfer,__bridge_retain等關(guān)鍵字來轉(zhuǎn)換橋接步责。
為什么有兩套返顺。主要是為了易于實(shí)現(xiàn)跨平臺開發(fā)和支持開發(fā)國際化。
三蔓肯、其他
1遂鹊、什么是懶加載(lazy loading)?
懶加載有成為“延遲加載”蔗包,核心思想就是把對象的實(shí)例化延遲到真正調(diào)用該對象時進(jìn)行秉扑,好處是減輕大量對象在實(shí)例化時對資源的消耗,而不是在程序初始化時就預(yù)先將對象實(shí)例化调限。另外舟陆,懶加載可以將實(shí)例化代碼從初始化函數(shù)中獨(dú)立出來,提高代碼可讀性耻矮,以便于代碼更好的被組織秦躯。
2、iOS中動態(tài)庫和靜態(tài)庫的區(qū)別是什么裆装?
(1)存在形式上:靜態(tài)庫已.a或者.framework為文件后綴踱承,動態(tài)庫以.dylib或者.framework為文件后綴。
(2)使用區(qū)別上:靜態(tài)庫鏈接時哨免,被完整的復(fù)制到可執(zhí)行文件中勾扭,動態(tài)庫鏈接時,不復(fù)制铁瞒,程序運(yùn)行時由系統(tǒng)動態(tài)加載到內(nèi)存妙色,供程序調(diào)用,當(dāng)多個程序共同調(diào)用時慧耍,只加載一次身辨,以節(jié)省內(nèi)存開銷。