简述内存分区情况:
- 代码区:存放函数二进制文件代码;
- 数据区:存放静态变量,常量,全局变量;
- 栈区:由高地址向下开辟的一块连续的内存空间,先进后出,所以不会有碎片问题,由编译器控制释放,无需手动释放,因此更有效率,分为静态分配(编译器完成分配,如局部变量)和动态分配(如alloc函数进行分配,由编译器自动释放)。栈的大小是编译器自动分配的,所以如果申请的内存空间大于剩余内存大小,会overflow。
- 堆区:由低地址向上的不连续内存空间,频繁的new/delete会造成内存碎片,降低运行效率。堆需要手动释放,回收内存。堆的内存空间更大,更灵活。
ps:oc中基本数据类型(int,double,float...)是在栈区,无需手动释放,超过作用域自动释放;对象(NSObject及其子类)是在堆区,需要手动释放release,回收内存。
pps:这里插一下,为什么block要用copy修饰符,因为block本质上是代码块,在栈区,为了防止生命周期结束自动被释放需要copy到堆区。
Better Late Than Never!
努力是为了当机会来临时不会错失机会。
共勉!
网友评论