iOS程序内存分布

iOS的程序内存分为五大区域,分别为栈,堆,BSS,全局变量,代码区。

分配时间区域名称描述
运行时分配局部变量,函数参数
运行时分配程序代码new出的对象
编译时分配BSS静态变量,未初始化的全局变量
编译时分配数据段已经初始化的全局变量,常量
编译时分配代码段程序二进制代码

栈区的地址一般以0x7开头,堆区的地址一般以0x6开头,这两个区域是函数调用的时候分配,函数执行结束后一般会释放。BSS区域,常量区域内存在程序运行期间一直存在,直到程序运行结束。

使用iOS工程,写一个方法testMethod,放入到ViewController的viewDidLoad中,断点到testMethod可以查看对应的变量。

//文件头部的静态变量和全局变量
//static NSInteger test = 1;
//const NSString *str = @"hello";

- (void)viewDidLoad {
    [super viewDidLoad];
    [self testMethod:@"method"];
}


- (void)testMethod:(NSString *)param
{
    NSString *local = [[NSString alloc] initWithFormat:@"%@", @"hello world!"];
    NSString *localstr = [[NSString alloc] initWithFormat:@"%@", @"hello"];
    //局部变量
    NSInteger tmpInt = 2;
    //堆变量
    NSLog(@"%@", local);
    //taggedPointer
    NSLog(@"%@", localstr);
    //全局变量
    NSLog(@"%@", str);
    //静态变量
    NSLog(@"%ld", test);
}

在方法的最后一行打断点,断点执行到的时候,右击debug区域的变量,选择View Memory of "xxxx"可以看到这个变量的内存地址。这里有个变量比较特殊,局部变量localstr在debug 区域可以看到它是NSTaggedPointerString,也没有放在堆区。对于这种较短的字符串,苹果做了优化,没有将他们放到堆区,而是直接把值写入到指针中,以便加快访问速度,并减少内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值