幾乎所有的類都是繼承自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 可以隨時開乙個分支,而不用拷貝 到另外乙個目錄。也即只有乙個當前操作版本?系統內部儲...