美文网首页
Tagged Pointer小知识

Tagged Pointer小知识

作者: 十一遥 | 来源:发表于2019-02-12 10:53 被阅读1次
运行下面两段代码,会发生什么事?

这两段代码看似一致,其实结果差别很大,代码1会崩溃(奔溃信息如下),代码2却不会;


从报错信息可以看出原因是坏内存访问,现在使用的是ARC,但是ARC的底层实现是MRC,如下:

//self.name赋值MRC实现
- (void)setName:(NSString *)name
{
    if (_name != name) {
        [_name release];
        _name = [name retain];
    }
}

由于线程不安全,多条线程同时执行了[_name release];这行代码,所以下一个线程进来的时候,发现self.name已经被释放了,那么就会出现坏内存访问的情况;

那么为什么代码2没有崩溃呢?
这是因为从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储,这些较小的对象,直接存储在栈区,所以线程不安全并没有影响到栈区。

arm64架构后指针有64位,于是把空余的位利用起来,存储对象值,这个就是Tagged Pointer

打印查看两字符对象的地址:



可以看出str2的地址明显高于str1,因为栈区的地址值,要在堆区之上,可以简易推测str2的值直接存在指针上。

详细的Tagged Pointer介绍有好多博客

深入理解Tagged Pointer

相关文章

  • Tagged Pointer

    Tagged Pointer专门用来存储小的对象,例如NSNumber和NSDate Tagged Pointer...

  • iOS内存管理方式

    iOS内存管理方式 Tagged Pointer(小对象) Tagged Pointer 专门用来存储小的对象,例...

  • iOS Tagged Pointer

    Tagged Pointer 介绍 苹果对于Tagged Pointer特点的介绍: Tagged Pointer...

  • iOS Tagged Pointer

    Tagged Pointer的特点 Tagged Pointer专门用来存储小的对象 譬如NSNumber和NSD...

  • Tagged Pointer小知识

    运行下面两段代码,会发生什么事? 这两段代码看似一致,其实结果差别很大,代码1会崩溃(奔溃信息如下),代码2却不会...

  • iOS Tagged Pointer总结

    Tagged Pointer特点:1.Tagged Pointer专门用来存储小的对象,例如NSNumber和NS...

  • iOS 内存管理 部分一

    主要讲解内存布局和 Tagged Pointer基础知识; 所有测试基于64位架构;Tagged Pointer测...

  • 聊聊伪指针 Tagged Pointer

    1、Tagged Pointer 介绍 1.1、什么是 Tagged Pointer? Tagged Pointe...

  • iOS tagged pointer

    iOS tagged pointer 从 64bit 开始,苹果引入了 tagged pointer 计数,用于优...

  • iOS 中的Tagged Pointer

    什么是Tagged Pointer对象 Tagged Pointer对象一般用于NSNumber、NSDate、N...

网友评论

      本文标题:Tagged Pointer小知识

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