isa 和 metaclass

元類是什麼?

其實在Objective-C中任何的類定義都是對象。即在程序啓動的時候任何類定義都對應於一塊內存。在編譯的時候,編譯器會給每個類生成一個且只生成一個」描述其定義的對象」,也就是蘋果說的類對象(class object),他是一個單例(singleton)。
NSObject內存中的第一個屬性是isa,後面有驗證

Class是objec_class的實例對象

objec_class是一個結構體,並且標明瞭第一位是ISA,圖示紅框處註釋

咱們注意到上圖的第二個位置是superclass咱們驗證以下

接下來咱們新建一個項目看看:
補充一點lldb的操做
p/x :16進制打印內存地址
x/2gx: 打印對象的前兩段內存地址,第一位isa,第二位superclass
po:這個不用多說你們都瞭解

複製代碼

經過上述對內存的操做(第一個16進制都是isa),能夠發現:
對象object的isa指向類TestObject,類TestObject的isa指向了元類TestObject,他們的名字是如出一轍的,元類是系統在編譯期動態生成的。
object對象的isa -> TestObject類 -> 元類TestObject -> NSObject -> NSObject
複製代碼
咱們看看蘋果給咱們的isa走位圖:

這個走位圖相信你們都有所瞭解,可是大家有注意一些細節的地方嗎?那麼咱們着重說一下圖示標紅的3個細節點位:

1.NSObject 的父類是nil。bash

2.根元類的父類是NSObject。markdown

3.NSObject的isa指向自身。spa

相關文章
相關標籤/搜索