初識TaggedPointer對象

//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]));
    }
}
相關文章
相關標籤/搜索