iOS中的堆和栈

对于iOS这种移动端的开发,程序员应该合理地管理内存,这样才能让应用更加灵活流畅地运行。在Andriod中,是由垃圾回收机制来处理在堆中的内存空间,而在iOS中,需要程序员手动操作在堆中间的内存空间,并进行内存的分配和释放(ARC之后换做应用帮助程序员进行大部分操作)

我们先来看看iOS中一共有哪些存储空间:
1、栈区(stack)
2、堆区(heap)
3、静态区
4、寄存器区
5、文字常量区
6、程序代码区
在这里一共有6种不同的区域,但我们做iOS开发最需要关心的是前二个,本文也是对前两个做详细介绍:(由于本文主要对理论上进行说明,所以文章的格式为列举知识点并进行分析的形式)

一、栈区:
栈区中的内存空间是由编译器自动释放的,一般来是存放参数,局部变量等等。需要我们关心的是下面几点:
1、由于栈中的内存空间都是以压栈和出栈的方式进行的,所以先声明的变量就会先压入栈,而栈的结构是这样的,最下面的栈的是最大的,也就是说,先声明(先压入栈)的内存地址比后声明(后压入栈)的内存地址要大。
2、在一个函数中,我们经常会声明一些函数的参数,在栈中,如果有函数的声明的话,那么会在栈中分配一个内存空间给这个函数,然后这块内存空间是独立于其他分配的内存空间的,也就是说:如果使用函数去将一个声明的变量作为参数,那么这个变量的内存空间是在函数内存空间外部的。函数本来有个形式参数,这个参数是在函数内存空间之内的。所以这两个变量的内存地址是不同的。
3、在iOS开发中,栈空间的大小为1M。

二、堆区:
我们知道栈空间只有1M,那么我们很多时候需要的资源都会超过1M,所以由此也引出了堆。在iOS中,栈空间是每个程序都有一个的,而且互相不干扰,堆空间则是一个系统公共的,换句话说就是所有的应用程序都使用一个堆空间。下面将要详细说明堆空间的几个特点:
1、所有堆中的内存空间分配都是由操作系统所控制的,如果一个应用程序需要一块内存空间,那么这时候操作系统收到通知后(例如我们实例化一个对象时候使用的alloc操作),就会在堆空间中去寻找,看哪一块区域比较合适(包括使用过的和没有使用过的),找到后就将这个内存空间的地址返回。alloc操作是告诉系统分配一块内存空间,然后这块内存空间可能是已经使用过的。所以接着,我们一般会使用init操作,这个操作就是初始化这一块内存空间。
2、对于堆中的内存空间的操作,是通过链表来操作的,这和C语言是一样的(Objective-C是基于C语言的)
3、通过上面的描述,我们已经知道,分配内存空间是由操作系统完成的,但是,关于内存空间的释放却是交给了程序员来完成。这也让地iOS系统的内存管理比andriod的内存管理机制要好。andriod中是由垃圾回收机制来操作的,程序中开出一条线程来专门复制垃圾回收,这条线程时不时地进入到堆空间中去看看有没有需要回收的内存空间。在iOS中,是不存在垃圾回收机制的,也就是说内存的释放需要程序员进行,如果在代码写的不完善,就会造成内存泄露,内存泄露就是说系统分配了空间之后但是没有进行释放,那么这个区域就一直被占用着,直到系统重新启动,清空了堆中的内存占用。
4、堆中的内存空间都是匿名访问的,也就是说系统如果收到通知,需要多大的空间,那么系统会分配这么大的空间,但是系统不会记录这个空间是给谁了,关于谁指向了这个空间系统是不知道的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值