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