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 存儲數據,