Preprocessor Macros
可針對(duì)不同的構(gòu)建配置設(shè)置相應(yīng)的預(yù)處理宏剪勿,在代碼中即可根據(jù)相應(yīng)的宏來(lái)判斷當(dāng)前執(zhí)行的構(gòu)建配置炼杖,然后執(zhí)行相應(yīng)的代碼
#ifdef DEBUG
#elif DEMO
#else
#endif
Precompile Prefix Header
說(shuō)明是否為 Target 創(chuàng)建一個(gè)預(yù)編譯頭文件渗鬼,新項(xiàng)目要主動(dòng)添加預(yù)編譯頭文件時(shí),該項(xiàng)需設(shè)置為 Yes。
Prefix Header
Target 預(yù)編譯頭文件的路徑。
Other Linker Flags
源代碼需要經(jīng)過(guò)預(yù)處理,編譯羡微,鏈接后最終生成可執(zhí)行文件。在將多個(gè) .obj 文件鏈接起來(lái)時(shí)惶我,就會(huì)用到 ld 命令妈倔,即 XCode 的鏈接器。而
Other Linker Flags 設(shè)置的就是 ld 命令的參數(shù)绸贡,它的3個(gè)常用參數(shù)為
- -ObjC盯蝴,鏈接器會(huì)把靜態(tài)庫(kù)中所有的Objective-C類(lèi)和分類(lèi)都加載到最后的可執(zhí)行文件中。在開(kāi)發(fā)過(guò)程中听怕,有時(shí)候會(huì)用到第三方的靜態(tài)庫(kù)(.a文件)捧挺,然后導(dǎo)入后發(fā)現(xiàn)編譯正常但運(yùn)行時(shí)會(huì)出現(xiàn)selector not recognized的錯(cuò)誤,從而導(dǎo)致app閃退尿瞭。而原因和Objective-C的一個(gè)重要特性:類(lèi)別(category)有關(guān)闽烙。Unix的標(biāo)準(zhǔn)靜態(tài)庫(kù)實(shí)現(xiàn)和Objective-C的動(dòng)態(tài)特性之間有一些沖突:Objective-C沒(méi)有為每個(gè)函數(shù)(或者方法)定義鏈接符號(hào),它只為每個(gè)類(lèi)創(chuàng)建鏈接符號(hào)声搁。這樣當(dāng)在一個(gè)靜態(tài)庫(kù)中使用類(lèi)別來(lái)擴(kuò)展已有類(lèi)的時(shí)候黑竞,鏈接器不知道如何把類(lèi)原有的方法和類(lèi)別中的方法整合起來(lái),就會(huì)導(dǎo)致你調(diào)用類(lèi)別中的方法時(shí)疏旨,出現(xiàn)"selector not recognized"很魂,也就是找不到方法定義的錯(cuò)誤。為了解決這個(gè)問(wèn)題充石,引入了-ObjC標(biāo)志莫换,它的作用就是將靜態(tài)庫(kù)中所有的和對(duì)象相關(guān)的文件都加載進(jìn)來(lái)霞玄。當(dāng)靜態(tài)庫(kù)中只有分類(lèi)而沒(méi)有類(lèi)的時(shí)候骤铃,-ObjC參數(shù)就會(huì)失效了。這時(shí)候坷剧,就需要使用-all_load或者-force_load了惰爬。
- -all_load,鏈接器會(huì)把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中惫企,但是千萬(wàn)不要隨便使用這個(gè)參數(shù)撕瞧!假如你使用了不止一個(gè)靜態(tài)庫(kù)文件陵叽,然后又使用了這個(gè)參數(shù),那么你很有可能會(huì)遇到ld: duplicate symbol錯(cuò)誤丛版,因?yàn)椴煌膸?kù)文件里面可能會(huì)有相同的目標(biāo)文件巩掺,所以建議在遇到-ObjC失效的情況下使用-force_load參數(shù)。
- -force_load页畦,所做的事情跟-all_load其實(shí)是一樣的胖替,但是-force_load需要指定要進(jìn)行全部加載的庫(kù)文件的路徑,這樣的話豫缨,你就只是完全加載了一個(gè)庫(kù)文件独令,不影響其余庫(kù)文件的按需加載