NSString對(duì)象retainCount詳述

一概述

本文主要是關(guān)于基于64位系統(tǒng)下椒振,NSString對(duì)象的retainCount分析。

二內(nèi)容

1.以下對(duì)象的retainCount為18446744073709551615也就是2的64次方減一,也就是ULONG_MAX

// @"123456789"是一個(gè)字符串常量,數(shù)據(jù)保存在數(shù)據(jù)區(qū)帽借,不在堆區(qū)妓盲,是不可能
// 被釋放的,所以他的retainCount為ULONG_MAX檐迟,就算執(zhí)行release也不會(huì)有變化
// 這三個(gè)的內(nèi)存地址也是一樣的0x10bc89060补胚,他們的class類型都為__NSCFConstantString
NSString *name = @"123456789";
NSString * name = [NSString stringWithString:@"123456789"];
NSString * name = [[NSString alloc] initWithString:@"123456789"];

// 下面的內(nèi)存地址于上面的不一樣,為0xa1ea1f72bb30ab19追迟,class類型為NSTaggedPointerString
NSString * name = [NSString stringWithFormat:@"123456789"];

NSTaggedPointerString這個(gè)類表示這是字符串的一種指針Tagged Pointer溶其,在蘋果推出了 采用64位架構(gòu)的A7雙核處理器 iphone 5s的時(shí)候,為了節(jié)省內(nèi)存和提高執(zhí)行效率敦间,蘋果提出了Tagged Pointer的概念瓶逃,這是為了從32位機(jī)器遷移到64位機(jī)器中后節(jié)省內(nèi)存。在蘋果的64位OC實(shí)現(xiàn)中廓块,若對(duì)象指針的二進(jìn)制第一位是1厢绝,則該指針為Tagged Pointer。

例如0xa1ea1f72bb30ab19其中a的2進(jìn)制為1010,第一位1表示這是Tagged Pointer带猴,010表示這是一個(gè)NSTaggedPointerString類昔汉;這個(gè)地址最后一位表示字符串的數(shù)目,這里是0101表示有9位字符串拴清;其中真正用來存儲(chǔ)的位數(shù)只有中間的14位16進(jìn)制靶病。這個(gè)地址本身其實(shí)就存儲(chǔ)了字符串的值,可以說是存儲(chǔ)在&strS內(nèi)存中值口予,只是偽裝成了地址娄周,它不需要存儲(chǔ)在數(shù)據(jù)區(qū),也不需要申請(qǐng)堆空間沪停。
NSTaggedPointerString的存儲(chǔ)有三種編碼方式:ASCII碼煤辨,六位編碼,五位編碼。

六位編碼:
NSTaggedPointerString 采用六位二進(jìn)制編碼掷酗,(14*4)/6=9.333…,可以看出最多存儲(chǔ)9位字符调违。字符數(shù)目8~9

五位編碼:
采用五位二進(jìn)制編碼,(14*4)/5 = 11.2泻轰,可以看出這種編碼最多存儲(chǔ)11位字符技肩。字符數(shù)目在10~11

1.以下對(duì)象的retainCount為1,class類型都為__NSCFString

// @"hello boy %@"和@"jack"這兩個(gè)是字符串常量浮声,是無法修改的虚婿,所以由這兩個(gè)組成的是一個(gè)新的字符串就不能再他們基礎(chǔ)上修改得到,只能申請(qǐng)新的內(nèi)存泳挥,只能在堆里面申請(qǐng)然痊,所以這時(shí)產(chǎn)生的NSString對(duì)象的retainCount為1
NSString *name = [[NSString alloc] initWithFormat:@"hello boy %@",@"jack"];
// 比較之前使用的stringWithFormat參數(shù)的對(duì)象的retainCount于之不一樣,因?yàn)楝F(xiàn)在的字符串超過了9個(gè)屉符,所以無法使用NSTaggedPointerString來保存剧浸,只能申請(qǐng)新的內(nèi)存,所以這時(shí)產(chǎn)生的NSString對(duì)象的retainCount為1
NSString * name = [NSString stringWithFormat:@"1234567890"];

備注:因?yàn)閞etainCount返回的數(shù)據(jù)類型為NSUInteger矗钟,在64為系統(tǒng)中為8個(gè)字節(jié)無符號(hào)整數(shù)唆香,打印的時(shí)候需要使用%lu,如果使用%d吨艇,則本應(yīng)該輸出為2^64-1躬它,會(huì)變成-1。

這是因?yàn)槎校瑪?shù)據(jù)保存的方式是補(bǔ)碼冯吓。正整數(shù)的原碼、反碼疮跑、補(bǔ)碼完全一樣组贺,即符號(hào)位固定為0,數(shù)值位相同祸挪;負(fù)整數(shù)的符號(hào)位固定為1锣披,由原碼變?yōu)檠a(bǔ)碼時(shí),規(guī)則如下: 1原碼符號(hào)位1不變贿条,整數(shù)的每一位二進(jìn)制數(shù)位求反,得到反碼增热;2反碼符號(hào)位1不變整以,反碼數(shù)值位最低位加1,得到補(bǔ)碼峻仇。無符號(hào)2^64-1保存的二進(jìn)制格式為64個(gè)1公黑,如果按照有符號(hào)打印,按照補(bǔ)碼反推,1反碼符號(hào)位1不變凡蚜,反碼數(shù)值位最低位減一1得到63個(gè)1加上最后一個(gè)0人断,2原碼符號(hào)位1不變,整數(shù)的每一位二進(jìn)制數(shù)位求反得到開頭為1中間為62個(gè)0末尾為1的二進(jìn)制數(shù)朝蜘,由于打印是%d恶迈,所以取32個(gè)低位數(shù),得到31個(gè)0和末尾一個(gè)1谱醇,剛好是-1.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末暇仲,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子副渴,更是在濱河造成了極大的恐慌奈附,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件煮剧,死亡現(xiàn)場離奇詭異斥滤,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勉盅,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門中跌,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人菇篡,你說我怎么就攤上這事漩符。” “怎么了驱还?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵嗜暴,是天一觀的道長。 經(jīng)常有香客問我议蟆,道長闷沥,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任咐容,我火速辦了婚禮舆逃,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘戳粒。我一直安慰自己路狮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布蔚约。 她就那樣靜靜地躺著奄妨,像睡著了一般。 火紅的嫁衣襯著肌膚如雪苹祟。 梳的紋絲不亂的頭發(fā)上砸抛,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天评雌,我揣著相機(jī)與錄音,去河邊找鬼直焙。 笑死景东,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奔誓。 我是一名探鬼主播斤吐,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼丝里!你這毒婦竟也來了曲初?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤杯聚,失蹤者是張志新(化名)和其女友劉穎臼婆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體幌绍,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡颁褂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了傀广。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颁独。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖伪冰,靈堂內(nèi)的尸體忽然破棺而出誓酒,到底是詐尸還是另有隱情,我是刑警寧澤贮聂,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布靠柑,位于F島的核電站,受9級(jí)特大地震影響吓懈,放射性物質(zhì)發(fā)生泄漏歼冰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一耻警、第九天 我趴在偏房一處隱蔽的房頂上張望隔嫡。 院中可真熱鬧,春花似錦甘穿、人聲如沸腮恩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庆揪。三九已至,卻和暖如春妨托,著一層夾襖步出監(jiān)牢的瞬間缸榛,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工兰伤, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留内颗,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓敦腔,卻偏偏與公主長得像均澳,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子符衔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 進(jìn)制基本概念 什么是進(jìn)制?進(jìn)制是一種計(jì)數(shù)的方式,數(shù)值的表示形式 常見的進(jìn)制十進(jìn)制找前、二進(jìn)制、八進(jìn)制判族、十六進(jìn)制 進(jìn)制書...
    極客江南閱讀 2,013評(píng)論 0 11
  • ?轉(zhuǎn)自百度百科 ?計(jì)算機(jī)中的符號(hào)數(shù)有三種表示方法躺盛,即原碼、反碼和補(bǔ)碼形帮。三種表示方法均有符號(hào)位和數(shù)值位兩部分槽惫,符號(hào)位...
    SunnyMore閱讀 1,778評(píng)論 0 1
  • 「WTF系列」深入Java中的位操作 關(guān)于WTF系列 引 學(xué)完本章節(jié)你將學(xué)會(huì)位的基礎(chǔ)概念與語法,并且還會(huì)一些騷操作...
    qiujuer閱讀 887評(píng)論 0 5
  • C語言是面向過程的,而C++是面向?qū)ο蟮?C和C++的區(qū)別: C是一個(gè)結(jié)構(gòu)化語言合冀,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)各薇。C程...
    小辰帶你看世界閱讀 4,647評(píng)論 2 0
  • 機(jī)器數(shù)之原碼反碼補(bǔ)碼 基本概念 字在計(jì)算機(jī)中,一串?dāng)?shù)碼作為一個(gè)整體來處理或運(yùn)算的君躺,稱為一個(gè)計(jì)算機(jī)字峭判,簡稱字。字通常...
    Showdy閱讀 1,096評(píng)論 0 2