OC的isa指針存儲了哪些信息邻梆?

OC中所有的實例對象、類對象和元類對象中都一個名為isa的成員變量绎秒,他們通常把它叫isa指針浦妄,既然是指針,那里面存儲的應(yīng)該就是一個地址见芹。在以前的32位系統(tǒng)中剂娄,isa確實就是存儲的一個地址,實例對象的isa存儲的是其對應(yīng)的類對象的地址玄呛,類對象的isa存儲的是其對應(yīng)的元類對象的地址阅懦,元類對象的isa存儲的是根元類對象的地址。

但是在現(xiàn)在的64位系統(tǒng)(arm64架構(gòu))中把鉴,蘋果對isa做了優(yōu)化故黑,里面除了存儲一個地址外還存儲了很多其他信息。一個指針占8個字節(jié)庭砍,也就是64位,蘋果只用了其中的33位來存儲地址混埠,其余31位用來存儲其他信息怠缸。下面我們來看下在arm64架構(gòu)中關(guān)于isa的定義:

#   define ISA_MASK        0x0000000ffffffff8ULL
#   define ISA_MAGIC_MASK  0x000003f000000001ULL
#   define ISA_MAGIC_VALUE 0x000001a000000001ULL
#   define ISA_BITFIELD                                                      \
      uintptr_t nonpointer        : 1;                                       \
      uintptr_t has_assoc         : 1;                                       \
      uintptr_t has_cxx_dtor      : 1;                                       \
      uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \
      uintptr_t magic             : 6;                                       \
      uintptr_t weakly_referenced : 1;                                       \
      uintptr_t deallocating      : 1;                                       \
      uintptr_t has_sidetable_rc  : 1;                                       \
      uintptr_t extra_rc          : 19
#   define RC_ONE   (1ULL<<45)
#   define RC_HALF  (1ULL<<18)

上面信息中定義的像ISA_MASK這種常量我們不用管,這些都是程序在操作isa的過程中要用到的钳宪,比如我們將isaISA_MASK進行按位與運算isa & ISA_MASK就可以得到isa中存儲的地址值揭北。

我們主要關(guān)注一下uintptr_t類型數(shù)據(jù):

  • nonpointer:(isa的第0位(isa的最后面那位),共占1位)吏颖。為0表示這個isa只存儲了地址值搔体,為1表示這是一個優(yōu)化過的isa
  • has_assoc:(isa的第1位半醉,共占1位)疚俱。記錄這個對象是否是關(guān)聯(lián)對象,沒有的話,釋放更快缩多。
  • has_cxx_dtor:(isa的第2位呆奕,共占1位)。記錄是否有c++的析構(gòu)函數(shù)衬吆,沒有的話梁钾,釋放更快。
  • shiftcls:(isa的第3-35位逊抡,共占33位)姆泻。記錄類對象或元類對象的地址值。
  • magic:(isa的第36-41位,共占6位)拇勃,用于在調(diào)試時分辨對象是否完成初始化四苇。
  • weakly_referenced:(isa的第42位,共占1位)潜秋,用于記錄該對象是否被弱引用或曾經(jīng)被弱引用過蛔琅,沒有被弱引用過的對象可以更快釋放。
  • deallocating:(isa的第43位峻呛,共占1位)罗售,標(biāo)志對象是否正在釋放內(nèi)存。
  • has_sidetable_rc:(isa的第44位钩述,共占1位)寨躁,用于標(biāo)記是否有擴展的引用計數(shù)。當(dāng)一個對象的引用計數(shù)比較少時牙勘,其引用計數(shù)就記錄在isa中职恳,當(dāng)引用計數(shù)大于某個值時就會采用sideTable來協(xié)助存儲引用計數(shù)。
  • extra_rc:(isa的第45-63位方面,共占19位)放钦,用來記錄該對象的引用計數(shù)值-1(比如引用計數(shù)是5的話這里記錄的就是4)。這里總共是19位恭金,如果引用計數(shù)很大操禀,19位存不下的話就會采用sideTable來協(xié)助存儲,規(guī)則如下:當(dāng)19位存滿時横腿,會將19位的一半(也就是上面定義的RC_HALF)存入sideTable中颓屑,如果此時引用計數(shù)又+1,那么是加在extra_rc上耿焊,當(dāng)extra_rc又存滿時揪惦,繼續(xù)拿出RC_HALF的大小放入sideTable。當(dāng)引用計數(shù)減少時罗侯,如果extra_rc的值減少到了0器腋,那就從sideTable中取出RC_HALF大小放入extra_rc中。綜上所述歇父,引用計數(shù)不管是增加還是減少都是在extra_rc上進行的蒂培,而不會直接去操作sideTable,這是因為sideTable中有個自旋鎖榜苫,而引用計數(shù)的增加和減少操作是非常頻繁的护戳,如果直接去操作sideTable會非常影響性能,所以這樣設(shè)計來盡量減少對sideTable的訪問垂睬。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末媳荒,一起剝皮案震驚了整個濱河市抗悍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌钳枕,老刑警劉巖缴渊,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鱼炒,居然都是意外死亡衔沼,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進店門昔瞧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來指蚁,“玉大人,你說我怎么就攤上這事自晰∧” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵酬荞,是天一觀的道長搓劫。 經(jīng)常有香客問我,道長混巧,這世上最難降的妖魔是什么枪向? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮咧党,結(jié)果婚禮上遣疯,老公的妹妹穿的比我還像新娘。我一直安慰自己凿傅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布数苫。 她就那樣靜靜地躺著聪舒,像睡著了一般。 火紅的嫁衣襯著肌膚如雪虐急。 梳的紋絲不亂的頭發(fā)上箱残,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天,我揣著相機與錄音止吁,去河邊找鬼被辑。 笑死,一個胖子當(dāng)著我的面吹牛敬惦,可吹牛的內(nèi)容都是我干的盼理。 我是一名探鬼主播,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼俄删,長吁一口氣:“原來是場噩夢啊……” “哼宏怔!你這毒婦竟也來了奏路?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤臊诊,失蹤者是張志新(化名)和其女友劉穎鸽粉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體抓艳,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡触机,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了玷或。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片儡首。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖庐椒,靈堂內(nèi)的尸體忽然破棺而出椒舵,到底是詐尸還是另有隱情,我是刑警寧澤约谈,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布笔宿,位于F島的核電站,受9級特大地震影響棱诱,放射性物質(zhì)發(fā)生泄漏泼橘。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一迈勋、第九天 我趴在偏房一處隱蔽的房頂上張望炬灭。 院中可真熱鬧,春花似錦靡菇、人聲如沸重归。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鼻吮。三九已至,卻和暖如春较鼓,著一層夾襖步出監(jiān)牢的瞬間椎木,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工博烂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留香椎,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓禽篱,卻偏偏與公主長得像畜伐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子谆级,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 某天掛載了一個新硬盤后烤礁,我的centos7系統(tǒng)第二天就出現(xiàn)了崩潰現(xiàn)象讼积,報錯如題“failed to start c...
    kevinhuangk閱讀 23,771評論 1 1
  • 尚dh閱讀 80評論 0 0
  • 2018年5月3日 星期四 晴 今天是孩子去作業(yè)班寫作業(yè)的第二天,孩子不在家寫作業(yè)自己還突然不適應(yīng)了脚仔,這個時間段...
    高錦澤閱讀 174評論 0 0
  • 使用URLSession進行重定向 遵守代理如下勤众,completionHandler(nil)則攔截重定向;
    lanxuping閱讀 1,494評論 0 0
  • 春夜喜雨 · 杜甫 好雨知時節(jié),當(dāng)春乃發(fā)生鲤脏。 隨風(fēng)潛入夜们颜,潤物細無聲。 野徑云俱黑猎醇,江船火燭明窥突。 曉看紅濕處,花重...
    水殿按涼州閱讀 562評論 0 0