1. 程式人生 > >【OC刨根問底】Runtime簡單粗暴理解

【OC刨根問底】Runtime簡單粗暴理解

本文授權轉載,作者:楚天舒(簡書

從C的面向過程到接觸OC的物件、訊息的過渡初期總會有知其然不知其所以然的糾結,相關的學習資源一般都是介紹有什麼、使用步驟一二三四的套路,這樣就很難知道知道本質是什麼,能幹什麼不能幹什麼,為什麼要選擇用它。而實際開發過程,都是先有什麼要解決,再努力找到實現方法。人腦的容易接受的資訊,也多是主幹到分枝的思維導圖,綱舉目張。所以,試著以自己的粗淺理解來寫一點關於OC執行時的東西。

程式碼的思想,大概是把重複且不變的東西封裝成可以重複利用的共性,把變化的東西細化為具體獨立鬆耦合的變數。這些可以是資料型別,也可以是實現的方法程式碼片段。類也是封裝的產物和可封裝的物件。被封裝的東西,需要找到裡面內容來具體地實現,就需要給裡面內容加個關聯的對映標識,比如索引(陣列)、字串(字典)、指標、SEL(方法的代號)、isa(物件)等等。大概來說就是用類和物件來封裝父類指標和方法列表,用對映來找到實現方法的程式碼片段。

主要思路:

例項物件instance->類class->方法method(->SEL->IMP)->實現函式

例項物件只存放isa指標和例項變數,由isa指標找到所屬類,類維護一個執行時可接收的方法列表;方法列表中的每個入口是一個方法(Method),其中key是一個特定名稱,即選擇器(SEL),其對應一個指向底層C實現函式的指標,即實現(IMP),。執行時機制最關鍵核心是objc_msgSend函式,通過給target(類)傳送selecter(SEL)來傳遞訊息,找到匹配的IMP,指向實現的C函式。

由於OC的執行時動態特性,在編譯之後可以在執行時通過C操作函式,動態地建立修改類資訊,動態繫結方法和重寫實現,靈活地實現一些自定義功能。

紙上寫了個大綱,沒有畫思維導圖,簡單列個目錄:

一、執行時Runtime介紹

二、類的本質:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 - 類相關: + 資料型別:class,object; - isa 元類 - superClass 根類 + 操作函式: - class_: + get: 類名,父類; 例項變數,成員變數;屬性;例項方法,類方法,方法實現; + copy: 成員變數列表;屬性列表;方法列表;協議列表; + add: 成員變數;屬性;方法;協議; + replace:屬性;方法; + respond:響應方法判斷(內省) + isMetaclass:元類判斷(內省) + conform:遵循協議判斷(內省) - objc_: + get: 例項變數;成員變數;類名;類;元類;關聯物件; + copy: 物件;類;類列表;協議列表; + set: 例項變數;成員變數;類;類列表;協議;關聯物件; + dispose: 物件; - 動態建立/銷燬類、物件 - 成員變數、屬性相關: + 資料型別:Ivar;objc_property_t;objc_property_attribute_t; + 操作函式: - ivar_: - property_: - 方法訊息相關:

相關推薦

OC刨根問底Runtime簡單粗暴理解

本文授權轉載,作者:楚天舒(簡書) 從C的面向過程到接觸OC的物件、訊息的過渡初期總會有知其然不知其所以然的糾結,相關的學習資源一般都是介紹有什麼、使用步驟一二三四的套路,這樣就很難知道知道本質是什麼,能幹什麼不能幹什麼,為什麼要選擇用它。而實際開發過程,都是先有什麼要解決,再努力找到實現方法。

簡單粗暴理解阿姆達爾定律

增加處理器數、計算負載分佈到更多處理器上——>提高計算速度 程式中可並行程式碼的比例決定你增加處理器(總核心數)所能帶來的速度提升的上限 PS: S=1/(1-a+a/n)其中,a為平行計算部

操作系統死鎖的理解

use 系統 pad clas 自己 web lazy 銀行家算法 pkg 【操作系統】死鎖的理解 2017-05-08 若愚 今天分享給大家操作系統中死鎖的相關概念和解決辦法,內容來自與自己當時做的筆記和網絡~有問題可以後臺回復,會盡量回答哦 一、死鎖的概念

機器學習如何簡單形象又有趣地講解神經網絡是什麽?

二層 紐約大學 都是 不定 一個 移動 機器學習 mat weixin 【機器學習】如何簡單形象又有趣地講解神經網絡是什麽? https://mp.weixin.qq.com/s/jAcInAWI6cVvsnevoHIShQ 作者:王小龍 鏈接:www.zhihu.

原始碼剖析MemoryPool —— 簡單高效的記憶體池 allocator 實現

      什麼是記憶體池?什麼是 C++ 的 allocator?       記憶體池簡單說,是為了減少頻繁使用 malloc/free new/delete 等系統呼叫而造成的效能損耗而設計的。當我們的程式需要頻繁地申請和釋放

OC底層KVO原理

KVO的原理是什麼?底層是如何實現的? 我們可以通過程式碼去探索一下。 建立自定義類:XGPerson @interface XGPerson : NSObject @property (nonatomic,assign) int age; @property (nonatomic,c

機器學習簡單易懂的行人檢測功能實現

載入訓練好的行人分類器,實現行人檢測功能。 程式碼中用到的訓練好的行人分類器"pedestrianDetect.xml"下載路徑:https://download.csdn.net/download/lyq_12/10742144 一、效果如下: 1、輸入原圖 2、輸出結果

OC底層Category、+load方法、+initialize方法原理

   Category原理 - Category編譯之後的底層結構是 struct categroy_t,裡面儲存著分類物件方法、屬性、協議資訊- 當程式執行時,通過runtime動態的將分類的方法、屬性、協議合併到一個大陣列中- 底層使用的是二維陣列進行儲存,比如:[[分類2方法列表

遊戲開發實現簡單對話方塊及音樂播放

//Windows視窗標頭檔案 #include <Windows.h> //PlaySound函式包含的標頭檔案 #pragma comment(lib,"winmm.lib") //主函式 int WINAPI WinMain(HINSTANCE hInstance,HINSTA

Polo the Penguin and StringsCodeForces - 288A 簡單尋找規律)

題目: Little penguin Polo adores strings. But most of all he adores strings of length n. One day he wanted to find a string that meets the fo

OC底層AssociatedObject 關聯物件

如何實現給分類“新增成員變數”? 預設情況下,因為分類底層結構的限制,不能新增成員變數到分類中。但可以通過關聯物件來間接實現 關聯物件提供了以下API   1> 新增關聯物件   void objc_setAssociatedObject(id object, const void

演算法基礎動態規劃的理解

本章是個很有趣的問題,也是難倒很多人的問題,同時這又是個會而不難的問題。 動態規劃的核心邏輯是:將問題分解為子問題。在《演算法圖解》這本書裡,深入淺出得講了遞推公式的推演邏輯,但是在關鍵部分,遞推公式部分,並沒給出邏輯。 整個過程好像是,前面一段道路很平緩,走起來很舒適,但是突然

OC底層OC物件本質,如 isa, super-class

 注:class 物件和 meta-class 物件都是 Class 型別的,它們其實結構都是一樣的,class物件中一樣會包含 類方法,只不過那個類方法是 空的而已。    同樣,meta-class物件中也有 類的屬性、物件方法、協議、成員變數,不過那些對應的值也都是空 isa指標 上面我們

簡單粗暴理解支援向量機(SVM)及其MATLAB例項

目錄 SVM概述 QP求解 SVM概述 SVM已經是非常流行、大家都有所耳聞的技術了。網路上也有很多相關的部落格,講解得都非常詳細。如果你要從零開始推導一個SVM,細緻摳它全程的數學原理,我建議可以閱讀此篇文章:Zhang Hao的《從零構建支援向

資料結構大小堆的理解,建立,增加和刪除元素操作

什麼是大小堆? 大小堆是基於完全二叉樹的結構; 大堆:任意一個結點的左右孩子的資料都小於此結點的資料,位於堆頂的結點的資料最大。 小堆:任意一個結點的左右孩子的資料都大於此結點的資料,位於堆頂的結點的資料最小。 下面以小堆為例,圖解: 以下都是以小堆為例 如何

OC梳理自動佈局

自動佈局基礎篇 關於自動佈局的基本使用,參考網上的文章即可,如: iOS開發-自動佈局篇:史上最牛的自動佈局教學! 自動佈局進階篇 抗拉伸與抗壓縮 相信許多比較少使用自動佈局的同學對下面的引數都感覺比較頭疼: 其實不難,請往下看: #####Content Hugging Prio

OC底層KVO原理

KVO的原理是什麼?底層是如何實現的? 我們可以通過程式碼去探索一下。 建立自定義類:XGPerson @interface XGPerson : NSObject @property (nonatomic,assign) int age; @property (nonatomic,co

OC底層KVC原理

 定義 KVC的全稱是Key-Value Coding,俗稱“鍵值編碼”,可以通過一個key來訪問某個屬性 常見的API有: - (void)setValue:(id)value forKeyPath:(NSString *)keyPath; - (void)setValue:(id)valu

效能評估P-R曲線理解

P-R曲線就是精確率precision vs 召回率recall 曲線,以recall作為橫座標軸,precision作為縱座標軸。首先解釋一下精確率和召回率。解釋精確率和召回率之前,先來看下混淆矩陣,負     正 負TN FP  正 FN TP把正例正確分類為正例,表示為

python Elasticsearchpython 簡單操作Elasticsearch

python提供了操作ElasticSearch 介面,因此要用python來操作ElasticSearch,首先要安裝python的ElasticSearch包 pip install elasticsearch 官網提供的python操作ES的簡單例子是