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];
}
}
浙公网安备 33010602011771号