文档章节

初识TaggedPointer对象

阿元
 阿元
发布于 2016/05/01 21:06
字数 448
阅读 99
收藏 0
//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]));
    }
}


© 著作权归作者所有

下一篇: 对象模型
阿元
粉丝 5
博文 163
码字总数 109777
作品 0
浦东
程序员
私信 提问
Tagged Pointer

NSNumber 因为在从32位升级到64位后,同一个对象占用的内存会变成原来的2倍,为了节省内存和访问效率而引入了TaggedPointer. 像NSNumber,NSDate的地址不是真正的地址,如果是NSNumber,那么地...

人仙儿a
2017/11/28
0
0
iOS系统源码思考:对象的引用计数存储在哪里?--从runtime源码得到的启示

引言:这篇文章旨在从runtime源码中分析出 引用计数 值本身的保存位置,适合对底层原理有兴趣的朋友,或者面试造火箭的同学(比如百度的面试官非常喜欢问底层原理:好,我知道你说了深浅复制...

陈满iOS
2018/07/16
0
0
初识react(五) 数据流终极解决方案 dva(零配置)

回顾 初识react(一) 揭开jsx语法和虚拟DOM面纱 初识react(二) 实现一个简版的html+redux.js的demo 初识react(三)在 react中使用redux来实现简版计数器 初识react(四) react中异步解决方案之 ...

言sir
2018/09/24
0
0
初识EventSourcing和CQRS

初识EventSourcing和CQRS 无标题2017-06-2515 阅读 架构设计 EventSourcing就是事件溯源的意思,我们平时在设计系统的时候都存储了对象的最终的状态,比如一个交易订单,它当前的状态是等待买...

无标题
2017/06/25
0
0
Ext.Error: Unable to parse the JSON returned by the server: You're trying to decode an invalid JSON String

Firefox给出的错误 Ext.Error: Unable to parse the JSON returned by the server: You're trying to decode an invalid JSON String: articlelist.jsp {"results":"100","rows":[{"id":"1"......

anonymous_007
2014/05/28
2.4K
2

没有更多内容

加载失败,请刷新页面

加载更多

redis 学习2

网站 启动 服务端 启动redis 服务端 在redis 安装目录下 src 里面 ./redis-server & 可以指定 配置文件或者端口 客户端 在 redis 的安装目录里面的 src 里面 ./redis-cli 可以指定 指定 连接...

之渊
昨天
2
0
Spring boot 静态资源访问

0. 两个配置 spring.mvc.static-path-patternspring.resources.static-locations 1. application中需要先行的两个配置项 1.1 spring.mvc.static-path-pattern 这个配置项是告诉springboo......

moon888
昨天
4
0
hash slot(虚拟桶)

在分布式集群中,如何保证相同请求落到相同的机器上,并且后面的集群机器可以尽可能的均分请求,并且当扩容或down机的情况下能对原有集群影响最小。 round robin算法:是把数据mod后直接映射...

李朝强
昨天
4
0
Kafka 原理和实战

本文首发于 vivo互联网技术 微信公众号 https://mp.weixin.qq.com/s/bV8AhqAjQp4a_iXRfobkCQ 作者简介:郑志彬,毕业于华南理工大学计算机科学与技术(双语班)。先后从事过电子商务、开放平...

vivo互联网技术
昨天
24
0
java数据类型

基本类型: 整型:Byte,short,int,long 浮点型:float,double 字符型:char 布尔型:boolean 引用类型: 类类型: 接口类型: 数组类型: Byte 1字节 八位 -128 -------- 127 short 2字节...

audience_1
昨天
11
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部