在iOS中,内存主要分为栈区
、堆区
、全局区
、常量区
、代码区
五大区域。
栈区(Stack):
1
.主要存放局部变量
和函数参数
(函数的隐藏参数(id self,SEL _cmd)
)
2
.向低地址扩展
的数据结构
3
.连续
的内存结构,遵循先进后出
的原则
4
.以0X7
开头
5
.由编译器自动分配
和释放
6
.栈区一般在运行时分配
堆区(Heap):
1
.主要存放对象
2
.向高地址扩展
的数据结构
3
.不连续
的内存结构,类似于链表
,遵循先进先出
的原则
4.
.需要手动管理
和释放
5
.以0X6
开头
6
.堆区一般在运行时分配
全局区(Global):
全局区是编译时分配的内存空间,在iOS中一般以0x1
开头,在程序运行过程中,此内存中的数据一直存在
,程序结束后由系统释放
,主要存放
-
未初始化的
全局变量
和静态变量
,即BSS区(.bss) -
已初始化的
全局变量
和静态变量
,即数据区(.data)
其中,全局变量是指变量值可以在运行时被动态修改
,而静态变量是static
修饰的变量,包含静态局部变量
和静态全局变量
常量区(.rodata):
- 常量区是编译时分配的内存空间,在程序结束后由系统释放,主要存放已经使用了的,且
没有指向
的字符串常量
- 字符串常量因为可能在程序中被多次使用,所以`在程序运行之前就会
提前分配内存
代码区(.text)
代码区是编译时分配主要用于存放程序运行时的代码,代码会被编译成二进制
存进内存的
验证:
- (void)test{
NSInteger i = 123;
NSLog(@"i的内存地址:%p", &i);
NSString *string = @"CJL";
NSLog(@"string的内存地址:%p", string);
NSLog(@"&string的内存地址:%p", &string);
NSObject *obj = [[NSObject alloc] init];
NSLog(@"obj的内存地址:%p", obj);
NSLog(@"&obj的内存地址:%p", &obj);
}
image.png
分析:
-
对于局部变量i,从地址可以看出是0x7开头,所以i存放在栈区
-
对于字符串对象string,分别打印了string的对象地址 和 string对象的指针地址string的对象地址是以0x1开头,说明是存放在常量区
-
string对象的指针地址是以0x7开头,说明是存放在栈区
-
obj的对象地址是以0x6开头,说明是存放在堆区
-
obj对象的指针地址是以0x7开头,说明是存放在栈区
网友评论