【iOS】-- 内存五大分区

2024-05-09 03:12
文章标签 ios 内存 分区 五大

本文主要是介绍【iOS】-- 内存五大分区,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【iOS】-- 内存五大分区

  • 内存五大分区
    • 1.栈区
      • 优点:
    • 2.堆区
      • 优点:
    • 3.全局区
    • 4.常量区
    • 5.代码区
  • 验证
  • static、extern、const关键字比较
    • 1.static关键字
      • static关键字的作用:
      • 全局静态变量
      • 局部静态变量
    • 2.extern关键字
      • 对内的全局变量
      • 对外的全局变量
    • 3.const关键字

内存五大分区

内存五大分区:
栈区(系统管理的地方),堆区(程序员管理的地方),常量区,全局区(静态区),代码区。
在这里插入图片描述

1.栈区

栈区(stack): 是一段连续的内存区域,从高地址向低地址存储,遵循先进后出(FILO)原则。 一般在运行时进行分配,内存空间由系统管理,变量过了作用域范围后内存便会自动释放。参数、函数、局部变量都放在栈区。参数入栈是从前往后入栈;而结构体入栈是从后往前入栈。

优点:

  • 栈是系统数据结构,对应线程/进程是唯一的。
  • 快速高效,缺点是有限制,数据不灵活。[先进后出]
  • 栈空间分静态分配和动态分配两种。
  • 静态分配是编译器完成的,比如自动变量(auto)的分配。
  • 动态分配由alloc函数完成。
  • 栈的动态分配无需释放(是自动的),也就没有释放函数。

下面来看一个例子:

NSObject *obj = [NSObject new];

obj是一个指针变量,不是一个对象,存储在栈区,真正的创建对象,new做的事情有四步:

  1. 在堆内存中申请一块合适大小的空间。
  2. 在申请的这块空间中根据类的模板创建对象。
  3. 初始化对象的属性,为对象的属性赋默认值:
    • 如果属性的类型是基本数据类型,就赋值为0。
    • C指针类型NULL。
    • OC指针类型 nil。
  4. 返回这个对象在堆空间的地址。
    将这个地址返回赋值给obj指针,该指针指向了堆空间中的NSObject对象。

2.堆区

堆区(heap): 由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如变量通过new、alloc、malloc、realloc分配的内存块就存放在堆区。

堆向高地址扩展的数据结构,是不连续的内存区域。 程序员负责在何时释放内存,在ARC程序中,计数器为0的时候,在当次的runloop结束后,释放掉内存。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。
对于堆来讲,频繁的new/delete势必会造成内存空间的不连续性,从而造成大量的碎片 ,使程序效率降低。

优点:

  • 灵活方便,数据适应面广泛,但是效率有一定降低。
  • 堆是函数库内部数据结构,不一定唯一。
  • 不同堆分配的内存无法互相操作。
  • 堆空间的分配总是动态的。

3.全局区

全局区(静态区) (static): 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。

全局区又可分为未初始化全局区(BSS段)和初始化全局区(DATA段)。

//举例int a; //未初始化的 .bssint a = 10; //初始化的 .data

4.常量区

文字常量区: 存放常量字符串,程序结束后由系统释放
该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。
存放常量:整型、字符型、浮点、字符串等。

5.代码区

程序代码区: 用来存放函数的二进制代码。
代码段需要防止在运行时被非法修改,所以只允许读取操作,而不允许写入操作。

验证

运行下面一段代码,看看变量在内存中是如何分配

- (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);  
}

运行结果如下:
在这里插入图片描述

  • 对于局部变量i,从地址可以看出是0x7开头,所以i存放在栈区
  • 对于字符串对象string,分别打印了string的对象地址 和 string对象的指针地址
    • string的对象地址是以0x1开头,说明是存放在常量区
    • string对象的指针地址是以0x7开头,说明是存放在栈区
  • 对于alloc创建的对象obj,分别打印了obj的对象地址 和 obj对象的指针地址(可以参考前文的汇总图)
    • obj的对象地址是以0x6开头,说明是存放在堆区
    • obj对象的指针地址是以0x7开头,说明是存放在栈区。

static、extern、const关键字比较

1.static关键字

static关键字的作用:

  1. 可以修饰局部变量,将局部变量存储到静态存储区。
  2. 可以修饰全局变量,限定全局变量只能在当前源文件中访问。
  3. 可以修饰函数,限定函数只能在当前源文件中调用。

全局静态变量

优点:无论是类方法还是实例方法都可以访问和修改全局静态变量,外部方法无法调用,供所用对象调用。
缺点:存在生命周期长,直到程序结束。

局部静态变量

优点:定义后只保存一份值,每次调用的时候,没有重新创建,节省空间,只能在该局部代码中使用。
缺点:存在生命周期长,直到程序结束,只能在该局部代码中使用。

2.extern关键字

全局变量分为两种:

对内的全局变量

优点:无论是类方法还是实例方法都可以访问和修改全局静态变量,外部方法无法调用,总所有对象使用
缺点:存在生命周期长,直到程序结束。

对外的全局变量

优点:除了该类,其他文件也可以访问该变量。
缺点:存在的生命周期长,从定义直到程序结束。并且外部可以修改其值,出现错误不容易定位。

全局静态变量与全局变量 其实本质上是没有区别的,只是存在修饰区别,一个static让其只能内部使用,一个extern让其可以外部使用。

3.const关键字

不同于变量,常量的值是固定不可变的,一般用于只读值。
优点:只可以读取值,不能修改。一般用于接口或者文字显示这种固定值。添加extern可以对外全局常量,任意位置都可以访问。
缺点:存在的生命周期长,从定义直到程序结束。需要在.h .m中分别定义代码较多。

这篇关于【iOS】-- 内存五大分区的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/972222

相关文章

Java内存管理 - 垃圾收集算法

我们都知道Java 中垃圾收集器 [GC] 的功能。但只有少数人试图深入了解垃圾收集的工作原理。你不是其中之一,这就是你在这里的原因。 在这个Java内存管理教程中,我们将尝试了解Java垃圾收集的当前算法,我们将了解这些算法的演变。 目录1. Java中的内存管理2.引用计数机制3.标记和清除机制4.停止并复制GC 5.分代停止和复制6.如何提高Java中的内存利用率 1.

【百度AI人脸核身+公安验证】IOS示例工程运行

注意:前提百度账号满足企业认证     注意:公安验证接口非免费。需要单独提交工单申请哦     注意:人脸识别应用勾选文字识别的身份证识别     注意:人脸模块客户端创建了应用。并设置了授权标识、包名相关信息 以上注意都满足。请看重要!!!SDK的license 下载IOS保存本地 下载自动配置授权信息的示例工程 并解压 双击运行FacePrint.

iOS 添加好友请求要怎么注册监听

协议:IChatManagerDelegate代理:[[EaseMob sharedInstance].chatManager addDelegate:self delegateQueue:nil];方法: /*! @method @brief 接收到好友请求时的通知 @discussion @param username 发起好友请求的用户username @param messa

iOS 环信UI集成步骤

新建项目, 把环信的依赖库以及SDK导入到项目中, 添加pch文件, 把项目的Other Linker Flags 改成 -ObjC把环信demo的几个文件导入项目: 3rdparty, Category, Custom, Resources, Class ->Chat -> ChatView, 还有它的define文件ChatDemoUIDefine.h在pch文件导入头文件

iOS 判断网络类型

##1.引入Reachability文件夹 在AFNetworking网络请求库中有一个子文件Reachability,这里面有一个类AFNetworkReachabilityManager是用来专门处理网络类型的。 把这个类拷贝到你的工程目录下。 ##2.引入相关的头文件 #import "AFNetworkReachabilityManager.h"#import <CoreTel

如何从iOS Developer 中下载xcode dmg

最新的xcode beta 版本可以直接下载dmg安装包,但是最新的xcode正式版本却只能更新。很多时候需要在多台机器上安装xcode,显然就需要dmg。自从出了xcode ghost 事件之后,又担心第三方的xcode下载会被植入后门,其实苹果开发者官网有dmg的安装包下载,只是隐藏的比深。 点击链接:https://developer.apple.com/downloads/ 这里面不但

iOS UITableView

一、创建UITableView 1.- initWithFrame:style: - (instancetype)initWithFrame:(CGRect)framestyle:(UITableViewStyle)style 二、列表视图的配置 1.style typedef enum {UITableViewStylePlain, //普通类型UITableViewStyleGr

iOS 延迟执行的几种方法

1、performSelector方法 - (void)viewDidLoad {[super viewDidLoad];NSLog(@"当前时间:%@",[NSDate date]);[self performSelector:@selector(delayMenthod) withObject:nil afterDelay:2.0];}- (void)delayMenthod{NSLog(

iOS 学习资源

一、个人博客 1、刚刚在线 2、浅谈iOS开发中方法延迟执行的几种方式 3、MBProgressHUD 4、MJRefresh 5、AFNetworking 6、iOS数据持久化 7、iOS微信支付 二、常用的开发平台地址 1、银联支付开发平台

iOS 数组排序

##1、字母排序 NSArray *arrData = @[@"i",@"b",@"a",@"d",@"e",@"f",@"g",@"h",@"c"];NSArray *sortArray = [arrData sortedArrayUsingSelector:@selector(compare:)];NSLog(@"%@",sortArray); 输出结果: ##2、数字排序