iOS-认识内存分配的几大区域

172 阅读1分钟

如果有错误的地方,请联系博主修改

一.代码段,我们写的代码放在这个区域,由编译期进行内存分配

二.文字常量区,一般以0x1开头,在编译期进行分配,在程序结束后由系统回收,内存连续,例:

NSString *str = @"abc";

此时str就处在文字常量区

三.全局区(静态区),一般以0x1开头,这里存放全局变量和静态变量,又分为bss段(未初始化的全局变量和静态变量)和data段(已初始化的全局变量和静态变量),编译期分配,程序结束后由系统回收,内存连续,内存由低到高,例:

int a;
int b = 10;

int main(int argc, char * argv[]) {
    static int c;
    static int d = 20;
}

此时,变量a,b,c,d都处在全局区,a,c在bss段,b,d在data段

四.堆区,一般以0x6开头,这里存放我们通过alloc,new,malloc等主动申请的内存,由程序员手动申请和释放,内存不连续,内存由低到高,例:

NSObject *obj = [[NSObject alloc] init];

此时obj指针所指向的那块内存区域就在堆区

五.栈区,一般以0x7开头,这里存放局部变量,函数参数及返回值等,由系统分配和释放,内存连续,内存由高到低,例:

int a = 10;
NSObject *obj = [[NSObject alloc] init];

此时局部变量a及指针obj存储在栈区,注意这里的obj是一个在栈中的指针,存储着一个指向堆内存的地址值