1.背景
對於64位系統,爲了節省內存和提升執行效率,蘋果提出了Tagged Pointer的概念。算法
2.特色
- 蘋果的64位Objective-C實現中,若對象指針的最低有效位爲奇數,則該指針爲Tagged Pointer。
- Tagged Pointer專門用來存儲小的對象,例如NSNumber/NSDate和NSString。
- Tagged Pointer指針的值不是地址,包含真正的值和對象類型信息。因此,實際上它不是一個對象,而是一個披着對象皮的普通變量。它的內存並不存儲在堆中,也不須要malloc和free。
- Tagged Pointer由於並非真正的對象,沒有isa 指針。
- 內存讀取和對象建立效率高。
3.說明
NSNumber *number = @25; //number地址:0xb000000000000192,解釋:b:NSNumber類型,25的16進制是19,2:整型
NSString *a = @"a"; // a的地址:0x10be1f340
NSString *b = [a mutableCopy]; // b的地址:0x6080002542b0
NSString *c = [b copy]; // c的地址:0xa000000000000611 爲Tagged Pointer。"a"的ASCII碼值爲61(十六進制)
- NSNumber類型:最高4位的「b」表示是NSNumber類型,最低4位(Int爲2,long爲3,float爲4,double爲5)表示基本數據類型,其他56位則用來存儲數值自己內容。存儲用的數值超過56位存儲上限的時候,那麼NSNumber纔會用真正的64位內存地址存儲數值,而後用指針指向該內存地址。
- NSString類型:最高位表示類型,最低位表示字符串長度。而其他的56位也是用來存儲數據內容。
- NSString類型:當字符串內存長度超過了56位的時候,Tagged Pointer並無當即用指針轉向,而是用了一種算法編碼,把字符串長度進行壓縮存儲,當這個算法壓縮的數據長度超過56位了才使用指針指向。
- NSString類型:當String的內容有中文或者特殊字符(非 ASCII 字符)時,那麼就只能存儲爲String指針。
- NSString類型:字面型字符串常量卻從不存儲爲Tagged Pointer,由於字符串常量必須在不一樣的操做系統版本下保持二進制兼容,而Tagged Pointer在運行時老是由Apple的代碼生成。