//http://www.itnose.net/detail/6491943.html 詳情文章 int main(int argc, char * argv[]) { @autoreleasepool { //將一個對象的指針拆成兩個部分:1.一部分直接存取數據。2.另外一部分做爲特殊標記,表示這是一個特別的指針,不指向任何一個地址 NSNumber *num1 = @10; NSNumber *num2 = @22; NSNumber *num3 = @33; NSNumber *numFFF = @(0xFFFF); //在64位模擬器中輸出 NSLog(@"num1 pointer is %p",num1);//num1 pointer is 0xb 0000000000000a 2 NSLog(@"num2 pointer is %p",num2);//num2 pointer is 0xb 00000000000016 2 NSLog(@"num3 pointer is %p",num3);//num3 pointer is 0xb 00000000000021 2 NSLog(@"numFFF pointer is %p",numFFF);//numFFF pointer is 0xb 0000000000ffff 2 //8字節承載不了時,生成普通的指針 NSNumber *number = @(0xEFFFFFFFFFFFFF); NSLog(@"number pointer is %p",number);//0x7fe902f00080 //TaggedPointer優勢 //1.專門用來存儲小的對象,它只是披着對象的「皮」的普通變量而已,內存讀取效率更高 //isa 的bit位含義 /* struct { uintptr_t indexed : 1; 0表示普通的isa,1,表示Tagged Pointer uintptr_t has_assoc : 1; 表示該對象是否有過associated對象,若是沒有,在析構釋放內存時能夠更快 uintptr_t has_cxx_dtor : 1; 表示該對象是否有C++或ARC的析構函數,若是沒有,在析構釋放內存時能夠更快 uintptr_t shiftcls : 33; 類的指針 uintptr_t magic : 6; 其固定值爲0xd2,用於在調式時分辨對象是否未完成初始化 uintptr_t weakly_referenced : 1; 表示該對象是否有過weak對象,若是沒有,在析構釋放內存時能夠更快 uintptr_t deallocating : 1; 表示該對象是否正在析構 uintptr_t has_sidetable_rc : 1; 表示該對象的引用計數值是否大道沒法直接在isa中保存 uintptr_t extra_rc : 19; 表示該對象超過1的引用計數值,例如,若是該對象的引用計數是6,則extra_rc的值爲5 }; */ return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); } }