這是我參與8月更文挑戰的第10天,活動詳情查看: 8月更文挑戰sql
Xcode
編譯項目以後,咱們會看到一個同名的dSYM
文件,dSYM
是保存十六進制函數地址映射信息
的中轉文件,咱們調試的symbols
都會包含在這個文件中,而且每次編譯項目的時候都會生成一個新的dSYM
文件,位於/User/<用戶名>/Library/Developer/Xcode/Archives
目錄下,對於每個發佈版本咱們都頗有必要保存對應的Archives
文件;數據庫
當咱們軟件release
模式打包或上線後,不會像咱們在Xcode
中那樣直觀的看到用崩潰的錯誤,這個時候咱們就須要分析crash report
文件了,iOS設備中會有日誌文件保存咱們每一個應用出錯的函數內存地址,經過Xcode
的Organizer
能夠將iOS設備中的DeviceLog
導出成crash
文件,這個時候咱們就能夠經過出錯的函數地址
去查詢dSYM
文件中程序對應的函數名和文件名。大前提是咱們須要有軟件版本對應的dSYM
文件,這也是爲何咱們頗有必要保存每一個發佈版本的Archives
文件了。編程
每個xx.app
和xx.app.dSYM
文件都有對應的UUID
, crash
文件也有本身的UUID
,只要這三個文件的UUID
-致,咱們就能夠經過他們解析出正確的錯誤函數信息了。api
xx.app
文件的UUID
, terminal 中輸入命令: dwarfdump --uuid xx.app/xx
(xx表明你的項目名)xx.app.dSYM
文件的UUID
,在terminal中輸入命令: dwarfdump --uuid xx.app.dSYM
crash
文件內第一行Incident Identifier
就是該crash
文件的UUID
。同一時間,CPU
只能處理1
條線程,只有1
條線程在工做(執行)多線程併發(同時)執行,實際上是CPU
快速地在多條線程之間調度
(切換)若是CPU調度線程的時間足夠快,就形成了多線程併發
執行的 假象思考:若是線程很是很是多,會發生什麼狀況?CPU
會在N
多線程之間調度,CPU
會累死,消耗大量的CPU
資源每條線程被調度執行的頻次會下降(線程的執行效率下降)markdown
能適當提升程序的執行效率能適當提升資源利用率(CPU、內存利用率)網絡
線程須要佔用必定的內存空間(默認狀況下,主線程佔用1M,子線程佔用512KB),若是開啓大量的線程,會佔用大量的內存空間,下降程序的性能線程越多,CPU在調度線程上的開銷就越大程序設計更加複雜:好比線程之間的通訊、多線程的數據共享;數據結構
GCD
是底層的C語言構成的API,而NSOperationQueue
及相關對象是Objc
的對象。在GCD
中,在隊列中執行的是由block
構成的任務,這是一個輕量級的數據結構;而Operation
做爲一個對象,爲咱們提供了更多的選擇;NSOperationQueue
中,咱們能夠隨時取消已經設定要準備執行的任務(固然,已經開始的任務就沒法阻止了),而GCD
無法中止已經加入queue
的block
(實際上是有的,但須要許多複雜的代碼);NSOperatio
n可以方便地設置依賴關係,咱們可讓一個Operation
依賴於另外一個Operation
,這樣的話儘管兩個Operation
處於同-個並行隊列中,但前者會直到後者執行完畢後再執行;KVO
應用在NSOperation
中,能夠監聽一個Operation
是否完成或取消,這樣子能比GCD
更加有效地掌控咱們執行的後臺任務;NSOperation
中,咱們可以設置NSOperation
的priority
優先級,可以使同一個並行隊列中的任務區分前後地執行,而在GCD
中,咱們只能區分不一樣任務隊列的優先級,若是要區分block
任務的優先級,也須要大量的複雜代碼;NSOperation
進行繼承,在這之,上添加成員變量與成員方法,提升整個代碼的複用度,這比簡單地將block
任務排入執行隊列更有自由度,可以在其之.上添加更多自定製的功能。總的來講,Operation queue
提供了更多你在編寫多線程程序時須要的功能,並隱藏了許多線程調度,線程取消與線程優先級的複雜代碼,爲咱們提供簡單的API入口。從編程原則來講,-般咱們須要儘量的使用高等級、封裝完美的API,在必須時才使用底層API。可是我認爲當咱們的需求可以以更簡單的底層代碼完成的時候,簡潔的GCD
或許是個更好的選擇,而Operation queue
爲咱們提供能更多的選擇。NSOperation
擁有更多的函數可用,具體查看api。NSOperationQueue
是在GCD
基礎.上實現的,只不過是GCD
更高一層的抽象NSOperationQueue
中,能夠創建各個NSOperation
之間的依賴關係。NSOperationQueue
支持KVO
。能夠監測operation
是否正在執行(isExecuted
)、是否結束(isFinished
) , 是否取消(isCanceld
)GCD
只支持FIFO
的隊列,而NSOperationQueue
能夠調整隊列的執行順序(經過調整權重
)。NSOperationQueue
能夠方便的管理併發、NSOperation
之間的優先級。NSOperation
的狀況:各個操做之間有依賴關係、操做須要取消暫停、併發管理、控制操做之間優先級,限制同時能執行的線程數量.讓線程在某時刻中止/繼續等。GCD
的狀況:通常的需求很簡單的多線程操做,用GCD
均可以了,簡單高效。從編程原則來講,通常咱們須要儘量的使用高等級、封裝完美的API,在必須時才使用底層API。當需求簡單,簡潔的GCD
或許是個更好的選擇,而Operation queue
爲咱們提供能更多的選擇。單一職責原則
Info.plist
Mach-O
加載Mach-O
文件(遞歸調用Mach-o
加載方法)attribute(constructor)
的C函數C++
靜態對象加載,調用Objc
的+load
函數main
函數UlApplicationMain
函數UIApplication
對象UIApplicationDelegate
對象並複製info.plist
,設置程序啓動的一些屬性Main Runloop
循環UlApplicationDelegate
對象開始處理監聽事件application.didFinishLaunchingWithOptions:
方法果info.plist
中配置了啓動的storyBoard
的文件名,則加載storyboard
文件UIWindow
->rootViewController
->顯示App
啓動過程當中每一個步驟都會影響啓動性能,可是有些部分所消耗的時間少之又少,另外有些部分根本沒法避免,考慮到投入產出比,咱們只列出咱們能夠優化的部分: main
(函數以前耗時的影響因素ObjC
類越多,啓動越慢C
的constructor
函數越多,啓動越慢C++
靜態對象越多,啓動越慢ObjC
的+load
越多,啓動越慢實驗證實,在ObjC
類的數目 同樣多的狀況下,須要加載的動態庫越多,App
啓動就越慢。一樣的,在動態庫同樣多的狀況下,ObjC
的類越多,App
的啓動也越慢。須要加載的動態庫從1
個上升到10
個的時候,用戶幾乎感知不到任何分別,但從10
個, 上升到100
個的時候就會變得十分明顯。同理,100
個類和1000
個類, 可能也很難查察以爲出,但1000
個類和10000
個類的分別就開始明顯起來。一樣的,儘可能不要寫atribute((constrcror))
的C函數
,也儘可能不要用到C++
的靜態對象;至於ObjC
的+load
方法,彷佛你們已經習慣不用它了。任何狀況下,能用dispatch_ _once()
來完成的,就儘可能不要用到以上的方法。main()
函數以後耗時的影響因素main()
函數的耗時applicationWillFinishLaunching
的耗時childViewController
的加載、view
及其subviews
的加載applicationWillFinishLaunching
的耗時0x8badf00d
:該編碼表示應用是由於發生watchdog
超時而被iOS
終止的。一般是應用花費太多時間而沒法啓動、終止或響應用系統事件。0xbad22222
:該編碼表示VolP
應用由於過於頻繁重啓而被終止Oxdead10cc
: 該代碼代表應用由於在後臺運行時佔用系統資源,如通信錄數據庫不釋放而被終止。Oxdeadfa11
:該代碼表示應用是被用戶強制退出的。根據蘋果文檔,強制退出發生在用戶長按開關按鈕直到出現「滑動來關機」,而後長按Home按鈕。強制退出將產生包含0xdeadfa11異常編碼的崩潰日誌,由於大多數是強制退出是由於應用阻塞了界面。NSUserDefaults
,sqlite
存儲文件數據加密,保護賬號和關鍵信息iOS
應用防反編譯加密技術之二:對程序中出現的URL
進行編碼加密,防此URL
被靜態分析iOS
應用防反編譯加密技術之三:對客戶端傳輸數據提供加密方案,有效防止經過網絡接口的攔截獲取數據iOS
應用防反編譯加密技術之四:對應用程序的方法名
和方法
體進行混淆,保證源碼被逆向後沒法解析代碼iOS
應用防反編譯加密技術之五:對應用程序邏輯結構進行打亂混排,保證源碼可讀性降到最低Runtime
、Runloop
、block
、SDWebImage
、AFN
、YYCache
、GCD
等等底層實現多線程