xcode編譯 優化策略

2021-08-20 07:16:59 字數 2717 閱讀 8228

檢視編譯時間

關閉xcode 終端輸入

開啟xcode cmd + b

1.在objective-c的專案中, @class通常放在.h檔案中, 主要作用在於提公升編譯效能, 且能防止標頭檔案的遞迴import.

編譯效能的考慮

通常, 使用#import引入乙個類的標頭檔案, 編譯時會將該類的標頭檔案中的所有資訊都引入, 包含屬性和方法, 但有時候卻不需要這麼多, 且包含這些資訊會降低編譯效能.

而@class就表示這只是乙個類而已, 我們所關心的僅此一點, 而不需要知道該類的內部有哪些屬性和方法. 這種情況下, 我們在.h標頭檔案中就可以僅僅使用@class, 以提公升編譯效能. 而在.m實現檔案中, 往往就需要知道類的內部資訊了, 這時就需使用#import來引入這些資訊.

ps若類檔案依次使用#import來引用, 則最開始的標頭檔案有變化, 則後續所有引用它的類都需要重新編譯.

而@class則不會有這個問題.

import會導致遞迴引用

另外, 以#import的方式引入乙個類, 有可能造成兩個類之間相互引入對方的標頭檔案, 造成遞迴引用. 這一點目前在xcode中不會再報錯誤了, 但依然是存在的.

include可能導致重複引入

import能夠保證標頭檔案只被引入一次, 而#include則可能會出現重複引入.

2.對常用的工具類進行打包(framework/.a)打包成framework或者靜態庫,這樣編譯的時候這部分**就不需要重新編譯了。

3.常用標頭檔案放到預編譯檔案裡

xcode的pch檔案是預編譯檔案,這裡的內容在執行xcode build之前就已經被預編譯,並且引入到每乙個.m檔案裡了。

4.debug模式下,不生成dsym檔案

dysm檔案裡儲存了除錯資訊,在debug模式下,我們可以借助xcode和lldb進行除錯。所以,不需要生成額外的dsym檔案來降低編譯速度。

5.debug開啟build active architecture only

在xcode -> build settings -> build active architecture only 改為yes。這樣做,可以只編譯當前的版本,比如arm7/arm64等等,記得只開啟debug模式。這個選項在高版本的xcode中自動開啟了。

6.debug模式下,關閉編譯器優化

psios編譯不管是oc還是swift,都是採用clang作為編譯器前端,llvm(low level vritual machine)作為編譯器後端。

編譯器前端

編譯器前端的任務是進行:語法分析,語義分析,生成中間**(intermediate representation )。在這個過程中,會進行型別檢查,如果發現錯誤或者警告會標註出來在哪一行。

編譯器後端

編譯器後端會進行機器無關的**優化,生成機器語言,並且進行機器相關的**優化。ios的編譯過程,後端的處理如下

1.lvvm優化器會進行bitcode的生成,鏈結期優化等等。

2.llvm機器碼生成器會針對不同的架構,比如arm64等生成不同的機器碼。

xcode build 編譯.m檔案時, 使用compilec和clang命令。export lang=en_us.us-ascii

export path="..."

clang -x objective-c -arch x86_64 -fmessage-length=0 -fobjc-arc... -wno-missing-field-initializers ... -ddebug=1 ... -isysroot iphonesimulator10.1.sdk -fasm-blocks ... -i 上文提到的檔案 -f 所需要的framework -iquote 所需要的framework ... -c classname.c -o classname.o

clang是實際的編譯命令

-x objective-c 指定了編譯的語言

-arch x86_64制定了編譯的架構,類似還有arm7等

-fobjc-arc 一些列-f開頭的,指定了採用arc等資訊。這個也就是為什麼你可以對單獨的乙個.m檔案採用非arc程式設計。

-wno-missing-field-initializers 一系列以-w開頭的,指的是編譯的警告選項,通過這些你可以定製化編譯選項

-ddebug=1 一些列-d開頭的,指的是預編譯巨集,通過這些巨集可以實現條件編譯

-iphonesimulator10.1.sdk 制定了編譯採用的ios sdk版本

-i 把編譯資訊寫入指定的輔助檔案

-f 鏈結所需要的framework

-c classname.c 編譯檔案

-o classname.o 編譯產物

xcode編譯配置

之前做cocos2dx的時候一直不明白srcroot和project dir是什麼具體含義,以為是2dx構建的,最近才查了一些資料。1.srcroot 巨集和 project dir 巨集 都指 xcodeproj所在的父目錄。2.search paths裡有引號和沒有引號的區別 雙引號的作用是如果...

Xcode 常見編譯問題

1 引用 include 報錯 3 公升級到xcode9.3之後,大括號裡宣告的屬性,在block裡面就會出現block implicitly retains self explicitly mention self to indicate this 的警告,大量這樣宣告的屬性,產生了大量的黃色警告...

提公升Xcode編譯效能,RAM磁碟編譯

deriveddata xcode會在檔案系統中集中的快取臨時資訊。每次對xcode ios專案進行clean build或者在ios虛擬機器上launch,xcode都會在derivedata資料夾中進行讀寫操作。換句話說,就是將derived data的讀寫從硬碟移動到記憶體中。deriveda...