原创 iOS 底層探索 - 應用加載

App 從被用戶在主屏幕上點擊之後就開啓了它的生命週期,那麼在這之中,究竟發生了什麼呢?讓我們從 App 啓動開始探索。在探索之前,我們需要熟悉一些前導知識點。 一、前導知識 以下參考自 WWDC 2016 Optimizin

原创 iOS 底層探索 - 方法

我們在前面探索了對象和類的底層原理,接下來我們要探索一下方法的本質,而在探索之前,我們先簡單過一遍 Runtime 的知識點,如果讀者對這塊內容已經很熟悉了的話可以直接跳過第一章。 PS: 由於筆者對彙編暫時還是摸索的階段,關

原创 iOS 底層探索 - alloc & init

alloc & init 探索 作爲 iOS 開發者,我們每天打交道最多的應該就是對象了,從面向對象設計的角度來說,對象的創建以及初始化是最基礎的內容。那麼,今天我們就一起來探索一下 iOS 中最常用的 alloc 和 ini

原创 iOS 底層探索 - cache_t

上一篇我們一起探索了 iOS 類的底層原理,其中比較重要的四個屬性我們都簡單的過了一遍,我們接下來要重點探索第三個屬性 cache_t,對於這個屬性,我們可以學習到蘋果對於緩存的設計與理解,同時也會接觸到消息發送相關的知識。 一

原创 iOS 底層探索 - 類

我們在前面探索了 iOS 中的對象原理,面向對象編程中有一句名言: 萬物皆對象 那麼對象又是從哪來的呢?有過面向對象編程基礎的同學肯定都知道是類派生出對象的,那麼今天我們就一起來探索一下類的底層原理吧。 一、iOS 中的類到

原创 iOS 查漏補缺 - LLVM & Clang

LLVM 是一個自由軟件項目,它是一種編譯器基礎設施,以 C++ 寫成,包含一系列模塊化的編譯器組件和工具鏈,用來開發編譯器前端和後端。它是爲了任意一種編程語言而寫成的程序,利用虛擬技術創造出編譯時期、鏈接時期、運行時期以及“閒

原创 iOS 查漏補缺 - RunLoop

RunLoop 在 0202 年的今天其實已經不是個新鮮的話題了,關於這方面的文章網上有很多大神總結得非常精闢。 作爲 iOS 查漏補缺系列,這篇文章是筆者探索 RunLoop 底層的一些知識點總結,同時也借鑑了網上一些優秀的

原创 iOS 查漏補缺 - PerformSelector

performSelector 系列的函數我們都不陌生,但是對於它不同的變種以及底層原理在很多時候還是容易分不清楚,所以筆者希望通過 runtime 源碼以及 GUNStep 源碼來一個個抽絲剝繭,把不同變種的 perform

原创 iOS 查漏補缺 - 線程

多線程是我們開發和麪試中都會遇到的一個重要概念,相比於其他編程語言和平臺,iOS 的多線程使用起來要比較友好和易用一些。但是對於多線程的基本概念,我們還是需要重視起來,這對於我們探索 pthread、NSThread、GCD 以

原创 iOS 底層探索 - KVC

一、KVC 初探 Key Value Coding 也即 KVC 是 iOS 開發中一個很重要的概念,中文翻譯過來是 鍵值編碼 ,關於這個概念的具體定義可以在 Apple 的官方文檔處找到。 Key-value coding i

原创 iOS 底層探索 - 類拓展和關聯對象

前面我們探索了 iOS 中類和分類的加載,關於類這一塊的內容,我們還有一些坑沒有填,比如類拓展和關聯對象,今天讓我們一起填下這塊的坑。 一、類拓展 1.1 什麼是類拓展? 關於類拓展的具體定義,大家可以直接參考 Apple 對於類

原创 iOS 底層探索 - 分類的加載

一、初探懶加載類 上一章我們探索了 iOS 中類的加載,讓我們簡單回顧一下大概的流程。 1.1 類的加載回顧 libObjc 向 dyld 註冊了回調 _dyld_objc_notify_register,當 dyld 把

原创 iOS 底層探索 - 類的加載

一、應用加載回顧 上一章我們對應用的加載有了初步的認識,我們知道了 系統調用 exec() 會我們的應用映射到新的地址空間 然後通過 dyld 進行加載、鏈接、初始化主程序和主程序所依賴的各種動態庫 最後在 initiali

原创 iOS 底層探索 - 消息查找

一、objc_msgSend 彙編補充 我們知道,之所以使用匯編來實現 objc_msgSend 有兩個原因: 因爲 C 無法通過寫一個函數來保留未知的參數並且跳轉到一個任意的函數指針。 objc_msgSend 必須足夠快。

原创 iOS 底層探索 - 消息轉發

一、動態方法解析流程分析 我們在上一章《消息查找》分析到了動態方法解析,爲了更好的掌握具體的流程,我們接下來直接進行源碼追蹤。 我們先來到 _class_resolveMethod 方法,該方法源碼如下: void _clas