iOS程序的内存布局

turboksiOS183

image.png

  1.     代码段:编译之后的代码

  2.     数据段:

    1. 字符串常量:比如NSString * str = @“123”

    2. 已初始化数据:已初始化的全局变量、静态变量等

    3. 未初始化的数据:未初始化的全局变量、静态变量等

  3.     栈:函数调用开销,比如局部变量。分配的内存空间地址越来越小

  4.     堆:通过alloc、malloc、calloc等动态分配的空间,分配的空间地址越来越大



    Tagged Pointer:

    1.    从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储。

    2.    在没有使用Tagged Pointer之前,NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值。

    3.    使用Tagged Pointer之后,NSNumber指针里边存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中

    4.    当指针不够存储数据时,才会使用动态分配内存的方式来存储数据

    5.    objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销


    如何判断一个指针是否为Tagged Pointer?

    1.    iOS平台,最高有效位是1(第64bit)

    2.    Mac平台,最低有效位是

    image.png


    

int main(int argc, const char * argv[]) {

    @autoreleasepool {

        

        NSString * name;

        name = [NSString stringWithFormat:@"asd"];

        NSLog(@"%@",name);

        

        

        NSString * str;

        str = [NSString stringWithFormat:@"asdfghjklqwertyuiopasdfghjklqwertyuiop"];

        NSLog(@"%@",str);


    }

    return 0;

}


打印结果:

(lldb) p name

(NSTaggedPointerString *) $3 = 0xd4246379d93db1bf @"asd"

(lldb) p str

(__NSCFString *) $4 = 0x000000010042a200 @"asdfghjklqwertyuiopasdfghjklqwertyuiop"

(lldb) 

    

    


返回列表

上一篇:GCD定时器

下一篇:dealloc

相关文章

iOS音视频之屏幕录制

iOS音视频之屏幕录制

苹果提供了一个自带的录屏功能、但是每次录屏的上边那个小红条的录制状态栏能忍?当然、平时的一些简单的录制就可以了、但是我们开发的程序要求就不一样了、要求高清和全屏。关于这个功能苹果也是提供了对应的类库供...

WKWebView

WKWebView

<!DOCTYPE html><head>    <title>HTML</title>    <meta...

dealloc

dealloc

当调用dealloc方法的时候,执行顺序可以在源码中查找如下(objc源码):1.// Replaced by NSZombies- (void)dealloc {    _obj...

百度地图自定义marker

百度地图自定义marker

#import "HomeViewController.h"#import "PaopaoView.h"@interface HomeViewControlle...

iOS的block

iOS的block

一:block的本质1.    block本质上是一个OC对象,它内部有个isa指针2.    block是封装了函数调用以及函数调用环境的OC对象3.&nbs...

Runtime动态创建类

Runtime动态创建类

- (void)viewDidLoad {    [super viewDidLoad];    Class KSObj = objc_allocateClas...