iOS 的内存与存储区域

栈区(stack)

概述:栈是向低地址扩展的数据结构,是一块连续的内存区域。由栈顶的地址和栈的最大容量是系统预先规定好的。栈的空间很小,大概1-2M。超出overflow。

使用:栈区,就是函数(方法)运行时向系统请求的内存。栈中的局部变量,参数由编译器分配和释放,函数运行就分配,函数结束就释放,由系统完成。是系统数据结构,对应进程唯一。

特别注意:系统栈的剩余空间 大于 所申请的空间,系统为程序提供内存,不然,报错异常,提示栈的溢出。

堆区(heap)

概述:堆是向高地址扩展的数据结构,不连续的内存区域。系统用链表储存空闲地址的。链表遍历由低向高。堆大小直接受设备有效虚拟内存影响。

1.首先应该知道操作系统有一个记录空闲内存地址的链表。
2.当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。
3.由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中

使用: 存放实体对象的。由程序员分配和释放(arc自动插入分配和释放代码),例如alloc 申请的会放入堆中。

全局\静态区(static)

静态变量和全局变量是存储在一起的。初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后有系统释放。

int a;//未初始化的静态区
int b = 10;//初始化的静态区

文字常量区

存放常量字符串,程序结束系统释放

程序代码区

存放函数的二进制代码

相关经典面试题

  1. 这段代码有什么问题,哪一方面的,怎么优化呢?
- (void) interviewForStackMemory
{
    for (int i = 0;i<1000000;i++)
    {
       NSString *str = @"金元宝";
       str = [str stringByAppendingString:@"是春哥的"];
    }
}

  1. 以下数据和变量都存储在那一类内存中

    int a;int c = 10;
    NSString *name1;NSString *name2 = @"lxx";
    - (void) interviewForStore
    {
        int b;
        NSString *name3 = @"hyc";
        NSString *name4;
        char h[] = "plm";
        static int k = 0;
    
        NSString *m = [[NSString alloc]initWithFormat:@"le"];
    }
    
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值