內(nèi)存管理之內(nèi)存布局

  • Tagged Pointer

從 5s 開始制跟,iPhone 均使用 arm64 指令集的處理器思币。在 64 位系統(tǒng)上彬向,一個(gè)指針占 8 個(gè)字節(jié),而指針指向的實(shí)例變量至少需要 16 個(gè)字節(jié)空郊,并且還需要執(zhí)行額外的一些操作,例如:申請內(nèi)存切揭,銷毀內(nèi)存狞甚。為了達(dá)到優(yōu)化的目的,蘋果將一些存儲(chǔ)數(shù)據(jù)的類廓旬,例如 NSString哼审,NSNumber,當(dāng)它們需要保存的數(shù)據(jù)不需要占用那么多的字節(jié)時(shí)孕豹,直接將數(shù)據(jù)保存在“指針”里面涩盾。

enum
#endif
{
    // 60-bit payloads
    OBJC_TAG_NSAtom            = 0, 
    OBJC_TAG_1                 = 1, 
    OBJC_TAG_NSString          = 2, 
    OBJC_TAG_NSNumber          = 3, 
    OBJC_TAG_NSIndexPath       = 4, 
    OBJC_TAG_NSManagedObjectID = 5, 
    OBJC_TAG_NSDate            = 6,

    // 60-bit reserved
    OBJC_TAG_RESERVED_7        = 7, 

    // 52-bit payloads
    OBJC_TAG_Photos_1          = 8,
    OBJC_TAG_Photos_2          = 9,
    OBJC_TAG_Photos_3          = 10,
    OBJC_TAG_Photos_4          = 11,
    OBJC_TAG_XPC_1             = 12,
    OBJC_TAG_XPC_2             = 13,
    OBJC_TAG_XPC_3             = 14,
    OBJC_TAG_XPC_4             = 15,
    OBJC_TAG_NSColor           = 16,
    OBJC_TAG_UIColor           = 17,
    OBJC_TAG_CGColor           = 18,
    OBJC_TAG_NSIndexSet        = 19,

    OBJC_TAG_First60BitPayload = 0, 
    OBJC_TAG_Last60BitPayload  = 6, 
    OBJC_TAG_First52BitPayload = 8, 
    OBJC_TAG_Last52BitPayload  = 263, 

    OBJC_TAG_RESERVED_264      = 264
};
NSString *str = [NSString stringWithFormat:@"%@",@"fffff"];          
NSNumber *a1 = [NSNumber numberWithInt:2];

NSLog(@"str - %lx",((uintptr_t)str ^ objc_debug_taggedpointer_obfuscator));
NSLog(@"a - %lx",((uintptr_t)a ^ objc_debug_taggedpointer_obfuscator));
打印結(jié)果:
str - 'a000066666666665'
a - 'b000000000000022'

str指針中a轉(zhuǎn)成二進(jìn)制為1010,最高位的1標(biāo)識tagged pointer励背;0102,由上面的枚舉值可知是OBJC_TAG_NSString,標(biāo)識字符串旁赊;最低位5則標(biāo)識字符串個(gè)數(shù)(number類型最低位標(biāo)識值類型,2椅野、4、5籍胯、3分別代表int long float double),中間位則用來存儲(chǔ)數(shù)值

Tagged Pointer 的引用主要解決內(nèi)存浪費(fèi)和訪問效率的問題竟闪。所以其有以下特點(diǎn):
1、Tagged Pointer 專門用于存儲(chǔ)小的對象杖狼,例如:NSString炼蛤、NSNumberNSDate
2蝶涩、Tagged Pointer指針的值不再是堆區(qū)地址理朋,而是真正的值。所以绿聘,實(shí)際上它不再是一個(gè)對象了嗽上,它只是一個(gè)披著對象皮的普通變量而已。所以熄攘,它的內(nèi)存并不存儲(chǔ)在堆中兽愤,也不需要 mallocfree
3挪圾、在內(nèi)存讀取上有著 3 倍的效率浅萧,創(chuàng)建時(shí)比以前快 106 倍

由此可見,蘋果引入Tagged Pointer哲思,不但減少了 64 位機(jī)器下程序的內(nèi)存占用洼畅,還提高了運(yùn)行效率。完美地解決了小內(nèi)存對象在存儲(chǔ)和訪問效率上的問題棚赔。

  • 引用計(jì)數(shù)

黃金法則

  • 自己生成的對象帝簇,自己持有
  • 非自己生成的對象徘郭,自己也能持有
  • 不在需要自己持有對象的時(shí)候,釋放
  • 非自己持有的對象無需釋放

拓展

  • 野指針己儒、僵尸對象崎岂、空指針
當(dāng)一個(gè)指針變量p指向一個(gè)對象obj的地址空間,則稱p持有obj闪湾,obj的引用計(jì)數(shù)+1,當(dāng)obj引用計(jì)數(shù)為0被釋放冲甘,則p不再持有obj,如果obj不被銷毀途样,則p就叫做野指針江醇,obj叫做僵尸對象,如果將obj銷毀何暇,則p不指向任何內(nèi)存地址陶夜,p叫做空指針
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市裆站,隨后出現(xiàn)的幾起案子条辟,更是在濱河造成了極大的恐慌,老刑警劉巖宏胯,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件羽嫡,死亡現(xiàn)場離奇詭異,居然都是意外死亡肩袍,警方通過查閱死者的電腦和手機(jī)杭棵,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來氛赐,“玉大人魂爪,你說我怎么就攤上這事〖韫埽” “怎么了滓侍?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蛙婴。 經(jīng)常有香客問我粗井,道長,這世上最難降的妖魔是什么街图? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任浇衬,我火速辦了婚禮,結(jié)果婚禮上餐济,老公的妹妹穿的比我還像新娘耘擂。我一直安慰自己,他們只是感情好絮姆,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布醉冤。 她就那樣靜靜地躺著秩霍,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蚁阳。 梳的紋絲不亂的頭發(fā)上铃绒,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天,我揣著相機(jī)與錄音螺捐,去河邊找鬼颠悬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛定血,可吹牛的內(nèi)容都是我干的赔癌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼澜沟,長吁一口氣:“原來是場噩夢啊……” “哼灾票!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起茫虽,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤刊苍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后濒析,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體班缰,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年悼枢,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片脾拆。...
    茶點(diǎn)故事閱讀 37,997評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡馒索,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出名船,到底是詐尸還是另有隱情绰上,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布渠驼,位于F島的核電站蜈块,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏迷扇。R本人自食惡果不足惜百揭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蜓席。 院中可真熱鬧器一,春花似錦、人聲如沸厨内。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至请毛,卻和暖如春志鞍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背方仿。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工固棚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人兼丰。 一個(gè)月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓玻孟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親鳍征。 傳聞我的和親對象是個(gè)殘疾皇子黍翎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評論 2 345