栈区(Stack)(先进后出)
就想象成:客栈,上下班准时,有规律,不用住宿的游客管理,由客栈内部人管理。
由编译器自动分配释放,存放函数的参数值,局部变量的值,操作方式类似于数据结构中的栈。只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出
堆区(heap)(先进先出)
就想象成:堆在一起的东西,需要我们自己去整理。
一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收。用于存放对象。
操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。堆是由new/alloc分配的内存,一般速度比较慢,而且容易产生内存碎片
如:
- (void)test:(NSString*)str{
NSArray *array = [[NSArray alloc] init];
[array release];
}
在MRC,我们如果将array = nil,而没有[array release];那么导致指针没了,堆中的对象还存在,但无法再被引用,就造成了内存泄漏。
在ARC,当方法结束后,栈中的array被编译器自动释放,就没有指针指向堆中的该对象了,编译器就会自动插入调用release回收该对象,因而不会导致内存泄漏。
野指针:当所指向的对象被释放或者收回,但是对该指针没有作任何的修改,以至于该指针仍旧指向已经回收的内存地址,此情况下该指针便称野指针.
全局区(静态区)
全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统释放
常量区
存放常量,程序结束后由系统释放
代码区
存放函数体的二进制代码
声明:本文非原创,仅仅整理一些开发技能知识文章,以作存档学习用
参考: