如果有错误的地方,请联系博主修改
一.代码段,我们写的代码放在这个区域,由编译期进行内存分配
二.文字常量区,一般以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是一个在栈中的指针,存储着一个指向堆内存的地址值