栈区(stack):存放局部变量和函数的参数值,由编译器自动释放内存,当函数结束时自动释放,其操作方式类似于数据结构中的栈,栈内存分配运算内置于处理器的指令集,效率较高,但是分配的内存比较小。
堆区(heap) :就是通过new malloc 分配的内存块,他们的生命周期 由程序员自行管理,可以是全局变量,也可以是局部变量,在应用程序结束的时候 自动释放。
栈区生命周期理解:
-(void)viewDidLoad{
[super viewDidLoad];
int a = 0;
int b = 1;
}
如上代码,当viewDidLoad函数结束时,局部变量a和b的作用域已经结束,编辑器就会释放掉 a和b 的内存。
堆区 生命周期理解:
@interface ViewController ()
{
NSArray * dataArr;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
dataArr = [NSMutableArray array];
}
-(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
daArr =@[@"1",@"2"];
}
在viewDidLoad函数中,对dataArr进行初始化,在堆中分配内存块,当viewDidLoad函数结束时,dataArr因为是全局变量没有被销毁,程序员就可以自己来管理它的生命周期。
总结:
栈区和堆区的区别主要为以下几点:
1.对于栈来说,内存管理由编译器自动分配释放;对于堆来说,释放工作由程序员控制。
2.栈的空间大小比堆小许多。
3.栈是机器系统提供的数据结构,计算机会在底层对栈提供支持,所以分配效率比堆高。
4.栈中存储的变量出了作用域就无效了,而堆由于是由程序员进行控制释放的,变量的生命周期可以延长。