【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_:
- 方法訊息相關:
|