從NSObject開始了解isa

2021-09-03 10:49:00 字數 2237 閱讀 9034

幾乎所有的類都是繼承自nsobject開始實現的,所有這篇文章我們也將從nsobject類開始來了解物件的建立及isa,文章也將從runtime原始碼開始讓讀者了解isa究竟是什麼東西。

nsobject* object = [[nsobject alloc] init];

nsobject* object = (((id)((nsobject *(*)(id, sel))(void *)objc_msgsend)

((id)objc_getclass("nsobject"), sel_registername("alloc")), sel_registername("init"));

分析:上面我通過命令 clang -rewrite-objc xx.m 將oc**轉換為c++原始碼,我們會發現這裡其實就是先呼叫alloc方法,再進一步呼叫init方法。

// nsobject.mm

+ (id)alloc

id _objc_rootalloc(class cls)

callalloc(class cls, bool checknil, bool allocwithzone=false)

else

}}

分析:物件建立過程程式會呼叫_objc_rootalloc方法,再通過方法callalloc去實現物件地建立。

objc_object::initinstanceisa(class cls, bool hascxxdtor)

objc_object::initisa(class cls, bool nonpointer, bool hascxxdtor)

else

}

執行initinstanceisa方法進行物件引數的初始化。

#   define isa_magic_value 0x001d800000000001ull
isa_magic_value的值轉換成二進位制,我們會發現isa_t的magic和nonpointer都被進行了初始化設定。

nonpointer為0時,訪問物件isa會返回乙個指向cls的指標。也就是在 iphone 遷移到 64 位系統之前時 isa 的型別;

nonpointer為1時,shiftcls才是指向cls的指標,也即是isa物件位址將是存放在shiftcls中,但isa還是儲存了一些cls的資訊。

magic則是判斷物件是否已經初始化;

has_cxx_dtor是判斷物件是否存在析構器,若不存在的話,記憶體釋放將會加快;

newisa.shiftcls = (uintptr_t)cls >> 3;
shiftcls是當前物件指向了類cls的指標。假設當前類cls位址為100000000001110101110000011111000,由於後面三位都為0,所以右移3位可以將不需要用到的位空出來,為isa留下 34 位用於效能的優化。

union isa_t 

isa_t(uintptr_t value) : bits(value)

class cls;

uintptr_t bits;

# if __arm64__

# define isa_mask 0x0000000ffffffff8ull

# define isa_magic_mask 0x000003f000000001ull

# define isa_magic_value 0x000001a000000001ull

struct ;

}

has_assoc是判斷物件是否有關聯,沒有可加速記憶體地釋放;

weakly_referenced是物件指向弱引用的變數,沒有也可加速記憶體釋放;

deallocating是物件正在釋放中;

has_sidetable_rc是物件的引用計數太大了;

extra_rc是物件引用計數減1;

以上則是對nsobject物件的objc原始碼解析及isa類指標資訊的說明,只不過現在直接獲取isa物件是不允許,直接會報錯誤,畢竟有些物件類似nsstring有時候被優化成taggedpointer指標了,其實不是乙個物件,不能通過isa對其進行操作。

從 nsobject 的初始化了解 isa

神經病院 objective-c runtime 入院第一天

arm64 and you

tagged pointer作用

從了解數倉開始

hive處理的資料都儲存在hdfs上 hive分析處理資料的底層實現是mapreduce 執行程式執行在yarn上 使用者介面 client 元資料 metastore 元資料報括 表名 表所屬的資料庫 預設是 default 表的擁有者 列 分割槽字段 表的型別 是否是外部表 表的資料所在目錄等 ...

了解區塊鏈,從挖礦開始

2014年那一陣,花了些錢,買了4塊r9 290x顯示卡組裝了乙個台式電腦,準備挖萊特幣,由於家人的反對,一直沒有開機,後來嫌佔地方 買不到大電源,買了兩個電源,因此得用大機箱,這樣一來,標準idc機櫃放不下 把顯示卡當二手賣掉,再買個機箱,留下一塊品相不好的顯示卡,當辦公電腦用了。這居住的小區,沒...

開始了解GIT

看到這樣幾個特點 1 任意機器都可以存放版本,鬆散而平等。2 分布式不是雲計算,並非乙份檔案分割存放在多台機器上。3 自己機器本身也是乙個版本庫,可以自己向自己提交,這就使得回溯變得簡單,不需要網路也不影響他人。4 可以隨時開乙個分支,而不用拷貝 到另外乙個目錄。也即只有乙個當前操作版本?系統內部儲...