iOS tagged pointer

iOS tagged pointer

從 64bit 開始,蘋果引入了 tagged pointer 計(jì)數(shù),用于優(yōu)化 NSNumber , NSDate , NSString 等小對(duì)象的存儲(chǔ),沒有這個(gè)數(shù)據(jù)之前,NSNumber 等對(duì)象需要?jiǎng)討B(tài)分配內(nèi)存,維護(hù)引用計(jì)數(shù),NSNumber 指針存儲(chǔ)的是堆中NSNumber對(duì)象的地址值,而引入了這個(gè)計(jì)數(shù)之后,NSNumber 指針里面存儲(chǔ)的數(shù)據(jù)是 : tag + data ,也就是直接將數(shù)據(jù)存儲(chǔ)在指針中。這樣做特別節(jié)省空間。如果這個(gè)數(shù)據(jù)特別大,指針存儲(chǔ)不下這個(gè)數(shù),那么會(huì)回復(fù)之前的方式,存儲(chǔ)在堆區(qū),然后指針存放堆區(qū)的地址。

dispatch_queue_t queue = dispatch_get_global_queue(0, 0 );
    for (int i = 0 ; i < 10000; i ++) {
        dispatch_async(queue, ^{
            self.name = [NSString stringWithFormat:@"%@",@"123sdfasfdas"];
        });
    }

上面會(huì)發(fā)生什么呢?答案是可能崩潰,因?yàn)槲覀兪嵌嗑€程同時(shí)方位name的set方法,那么的set方法好比


-(void)setName:(NSString *)name{
    if (_name != name) {
        [_name release];
        _name = [name copy];
    }
}

好比這樣,多個(gè)線程有可能同時(shí)去 release,所以會(huì)崩潰

解決方案,可以加鎖,在name設(shè)置前后去加鎖。

如果改成這樣呢?


dispatch_queue_t queue = dispatch_get_global_queue(0, 0 );
    for (int i = 0 ; i < 10000; i ++) {
        dispatch_async(queue, ^{
            self.name = [NSString stringWithFormat:@"%@",@"123"];
        });
    }
    

就是把一個(gè)長(zhǎng)字符串變成一個(gè)短的字符創(chuàng),這時(shí)候發(fā)現(xiàn),沒有崩潰。因?yàn)楹笠粋€(gè)指針為 tagged pointer 類型的,就不存在release的操作,值直接就存儲(chǔ)再來指針的里面,直接取值就可以了,所以就不會(huì)崩潰,他就不是一個(gè)OC對(duì)象。


 NSString *str = [NSString stringWithFormat:@"123"];
    NSString *str1 = [NSString stringWithFormat:@"aefasfasdfasfdasf"];
    NSLog(@"%@  %@",[str class],[str1 class]);


我們來打印下兩個(gè)類


 NSTaggedPointerString  __NSCFString

可以看到 第一個(gè)類為 tagged pointer 類,也證明了我們的猜想。

其實(shí)源碼里面是有判斷的,當(dāng)為mac 的時(shí)候 &1,當(dāng)為ios的時(shí)候&(1<<63),所以 ios 最高有效位為1就為 tagged pointer 類型,mac 最低有效位為1就為tagged pointer

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 這篇文章是參考很多資料才寫出來的,有部分內(nèi)容這幾位寫的都很詳細(xì)到位,所以就直接拷貝了,這里向這幾位作者學(xué)習(xí):深入理...
    晨寂閱讀 7,299評(píng)論 3 25
  • Tagged Pointer 介紹 蘋果對(duì)于Tagged Pointer特點(diǎn)的介紹: Tagged Pointer...
    Q14閱讀 512評(píng)論 0 0
  • Tagged Pointer是什么 我們知道,通常情況下,定義一個(gè)變量所占用的內(nèi)存是與CPU的位數(shù)有關(guān),比如NSI...
    米嘉勒閱讀 1,048評(píng)論 1 3
  • 一. 內(nèi)存區(qū)域 驗(yàn)證上圖,代碼如下: 運(yùn)行后,整理打?。?可以發(fā)現(xiàn): 上面的內(nèi)存地址從小到大。 字符串常量一樣的時(shí)...
    Imkata閱讀 833評(píng)論 1 2
  • 大魚的心路 忽如一陣大雨 大魚 救贖 大愚 如一臺(tái)壓路機(jī) 碾平一路坑洼 心路坦蕩 一生無涯 (在小說《大魚》?的閱...
    安徽江美琳閱讀 145評(píng)論 0 1

友情鏈接更多精彩內(nèi)容