內存管理:Tagged Pointer,優化NSNumber、NSDate、NSString等小對象的存儲 Tagged Pointer 如何判斷一個指針是否爲Tagged Pointer?

Tagged Pointer

從64bit開始,iOS引入了Tagged Pointer技術,用於優化NSNumber、NSDate、NSString等小對象的存儲

在沒有使用Tagged Pointer之前, NSNumber等對象需要動態分配內存、維護引用計數等,NSNumber指針存儲的是堆中NSNumber對象的地址值

使用Tagged Pointer之後,NSNumber指針裏面存儲的數據變成了:Tag + Data,也就是將數據直接存儲在了指針中

當指針不夠存儲數據時,纔會使用動態分配內存的方式來存儲數據

objc_msgSend能識別Tagged Pointer,比如NSNumber的intValue方法,直接從指針提取數據,節省了以前的調用開銷


如何判斷一個指針是否爲Tagged Pointer?

iOS平臺,最高有效位是1(第64bit)
Mac平臺,最低有效位是1


思考

代碼1

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    for (int i = 0; i < 1000; i++) {
        dispatch_async(queue, ^{
            self.name = [NSString stringWithFormat:@"abcdefghijk"];
        });
    }

代碼2

dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    for (int i = 0; i < 1000; i++) {
        dispatch_async(queue, ^{
            self.name = [NSString stringWithFormat:@"abc"];
        });
    }

問?代碼1 代碼2的程序運行情況

  • 1、代碼1 會造成壞內存訪問,造成crash
  • 2、代碼2 正常運行,且字符串賦值成功

分析:

  • 該段代碼self.name = [NSString stringWithFormat:@"abcdefghijk"];執行時,self.name 作爲一個對象使用,執行set方法,多線程訪問

  • 該段代碼self.name = [NSString stringWithFormat:@"abc"];執行時,self.name 直接使用tagged pointer 存儲數據,

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章