美文网首页
内存管理 Tagged Pointer

内存管理 Tagged Pointer

作者: TaoGeNet | 来源:发表于2020-03-01 23:00 被阅读0次

    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

          本文链接:https://www.haomeiwen.com/subject/rcfdkhtx.html