初识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]));
    }
}


你可能感兴趣的:(初识TaggedPointer对象)