内存管理-Tagged%20Pointer

01

从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储
在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值,
没有使用TaggetPointer之前存储一个10就要开辟一块独立的空间,然后使用一个指针变量指向他,

NSNumber *number = [NSNumber numberWithInt:10];
        NSNumber *number2 = @(10);
        NSNumber *number3 = @10;
        
        //我们平时使用10 的话可以直接使用一个int来表,但是我们因为经常要把数字放到数组里面
        //所以要把他包装成一个对象,
//但是一个int只需要4个字节就可以表示了,使用NSNumber的话会占用至少24个字节,指针8字节,
//NSObject对象16字节,
//所以会造成内存的浪费

        int nuber4 = 10;

因此苹果推出了TaggedPointer技术
使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中,
Tag就是标记信息,用来说明他是什么类型的数据,Data里面存储了他的真正的数据,
当指针不够存储数据时,才会使用动态分配内存的方式来存储数据

objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销

TaggetPointer

Tagged%20Pointer02

考以下2段代码能发生什么事?有什么区别?


TaggetPointer字符串

第一个在使用的时候可能会使程序崩溃,因为release了两次,因为字符串太长的话就是一个字符串对象,使用self .name来设置新的值就是使用set方法,这样就有可能对刚释放的对象在进行释放,
但是如果字符串很短的话,他就不是一个OC对象,他是一个taggedPointer就可以直接从指针中取值。

  • 如何判断一个指针是否为Tagged Pointer?
    iOS平台,最高有效位是1(第64bit)
    Mac平台,最低有效位是1

你可能感兴趣的:(内存管理-Tagged%20Pointer)