内存管理 Tagged Pointer

Tagged Pointer
通常创建对象,对象存储在堆中,对象的指针存储在栈中。
我们要找到这个对象,就需要先在栈中,找到指针,然后通过指针找到堆中的对象。

这个过程比较繁琐,当存储的对象只是个很小的东西,比如字符串,数字,走这个繁琐的过程,耗费性能。

从64bit开始,iOS 引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储

在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值.

使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中.

当指针不够存储数据时,才会使用动态分配内存的方式来存储数据.

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

// 是否是tagger pointer
- (void)test {
    NSNumber *number1 = @4;
    NSNumber *number2 = @5;
    NSNumber *number3 = @(0xFFFFFFFFFFFFFFF);
    
    NSLog(@"%d %d %d", [self isTaggedPointer:number1], [self isTaggedPointer:number2], [self isTaggedPointer:number3]);
    NSLog(@"%p %p %p", number1, number2, number3);
}

set方法,会先release

-(void)setName:(NSString *)name{
    if(_name != name){
        [_name realease];
        _name = [name copy];
    }
    return _name;
}

多线程release会导致crash

参考
2019-12-19 深入理解Tagged Pointer

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