iOS内存布局,Taged Pointer

由低地址->高地址布局如下

1.保留区 -> 代码区(__Text) ->数据区(__Data) ->堆区 -> 栈区 ->内核区

1.1 数据区:

字符串常量

已初始化 全局变量 ,静态变量

未初始化 全局变量 ,静态变量

1.2 堆区: 通过alloc new malloc 等生成的对象 

2.1 Taged Pointer 64位结构下对 NSNumber NSDate NSString小对象存储的优化

    iOS平台判断对象指针最高有效位为1 ,就是Taged Pointer ,取最低有效位 (p&(1<63))==1,

    当指针不够存储时会变回动态分配内存方式存储数据,

    objc_msgSender直接从指针获取值,堆空间地址最后一位为0(iOS指针对象内存对齐)

2.2  以下两代码运行结果有什么结果

   dispatch_queue_t queue = dispatch_get_global_queue(0, 0);

    for (int i = 0; i < 1000; i++) {

        dispatch_async(queue, ^{

            self.name = [NSString stringWithFormat:@"abcdefghijk"];

        });

    }

    dispatch_queue_t queue = dispatch_get_global_queue(0, 0); 

    for (int i = 0; i < 1000; i++) {

        dispatch_async(queue, ^{

            self.name = [NSString stringWithFormat:@"abc"];

        });

    }

- (void)setName:(NSString *)name {

    if (_name != name) {

        [_name release];

        _name = [name retain];

    }

}

posted @ 2021-05-28 10:20  syh-918  阅读(95)  评论(0)    收藏  举报