没有合适的资源?快使用搜索试试~ 我知道了~
一. 计算机的基本知识 1.1)硬件内存区分 1.2)RAM和ROM的特点和区别 1.3)RAM和ROM的协同工作 二. 内存分区 2.1)代码区 2.2)常量区 2.3)全局(静态)区 2.4)堆(heap)区 2.5)栈(stack)区 2.6)内存分区总结 三. 堆和栈的区别 3.1)申请方式和回收方式 3.2)申请后的系统响应 3.3)申请大小的限制 3.4)申请效率的比较 3.5)分配方式的比较 3.6)分配效率的比较 四. 内存分配的引入 4.1)什么行为会增加App的内存占用? 4.2)内存管理范围 4.3)内存管理原因 五. Objective-C内存管理 5.1)Objective-C内存管理相关术语 5.2)什么是引用计数? 5.2.1)引用计数解释 5.2.2)文艺解释 5.2.3)代码测试 5.3)自动释放池 5.3.1)AutoreleasePool的原理 5.3.2)自动释放池的创建和销毁 5.3.3)自动释放池的使用场景
资源推荐
资源详情
资源评论
⼀. 计算机的基本知识
1.1)硬件内存区分
1.2)RAM和ROM的特点和区别
1.3)RAM和ROM的协同⼯作
⼆. 内存分区
2.1)代码区
2.2)常量区
2.3)全局(静态)区
2.4)堆(heap)区
2.5)栈(stack)区
2.6)内存分区总结
三. 堆和栈的区别
3.1)申请⽅式和回收⽅式
3.2)申请后的系统响应
3.3)申请⼤⼩的限制
3.4)申请效率的⽐较
3.5)分配⽅式的⽐较
3.6)分配效率的⽐较
四. 内存分配的引⼊
4.1)什么⾏为会增加App的内存占⽤?
4.2)内存管理范围
4.3)内存管理原因
五. Objective-C内存管理
5.1)Objective-C内存管理相关术语
5.2)什么是引⽤计数?
5.2.1)引⽤计数解释
5.2.2)⽂艺解释
5.2.3)代码测试
5.3)⾃动释放池
5.3.1)AutoreleasePool的原理
5.3.2)⾃动释放池的创建和销毁
5.3.3)⾃动释放池的使⽤场景
5.4)MRC⼿动管理引⽤计数
5.4.1)对象操作
5.4.2)四个法则
5.4.3 ⾮⾃⼰⽣成的对象,且该对象存在,但⾃⼰不持有
5.5)ARC⾃动管理引⽤计数
5.5.1)ARC介绍
5.5.2)所有权修饰符
5.6)循环引⽤
5.7)Core Foundation 对象的内存管理
5.8)总结常⻅内存泄漏
参考⽂章
这世上,没有谁活得⽐谁容易,只是有⼈在呼天抢地,有⼈在默默努⼒。
随着科技的发展,移动设备的内存越来越⼤,设备的运⾏速度也越来越快,但是相对于整个应⽤市场上成千上万的应⽤容量来说,还是及其有限的。因此,每
⼀个应⽤所能占⽤的内存是有限制的。这⼀专题就是来探讨系统中的内存是如何分配的。
⼀. 计算机的基本知识
1.1)硬件内存区分
我们的⼿机、电脑、或者智能设备都有随机存储器RAM(运⾏内存/主存)和只读存储器ROM(相当于计算机中的硬盘)。RAM是内部存储,ROM是外部存储。我
们的CPU直接访问的是RAM,如果想访问外部存储,则数据须先从ROM中将数据调度到RAM中才能被CPU访问。也就是说CPU不能直接从内存卡等硬盘⾥⾯读取
数据。
1.2)RAM和ROM的特点和区别
RAM:运⾏内存,CPU可以直接访问,访问速度快,价格⾼。不能够掉电存储,断电会失去数据,不稳定;
ROM:存储型内存,CPU不可以直接访问,访问速度慢,价格低。可以掉电存储,稳定;
1.3)RAM和ROM的协同⼯作
由于RAM不⽀持掉电存储,所以App程序⼀般存储在ROM中。⼿机⾥⾯使⽤的ROM基本都是Nand Flash(闪存),CPU是不能直接访问的,⽽是需要⽂件系
统/驱动程序(嵌⼊式中的EMC)将其读到RAM⾥⾯,CPU才可以访问。另外,RAM的速度也⽐Nand Flash快。
⼆. 内存分区
说到内存分区,内存即指的是RAM,可以分为5个区。所有的进程(执⾏中的程序)都必须占⽤⼀定数量的内存(RAM),它或许是⽤来存放从磁盘(ROM)
载⼊的程序代码,或是存放取⾃⽤户输⼊的数据等等。不过进程对这些内存的管理⽅式因内存⽤途不⼀⽽不尽相同,有些内存是事先静态分配和统⼀回收的,
⽽有些却是按需要动态分配和回收的。
2.1)代码区
代码段是⽤来存放可执⾏⽂件的操作指令(存放函数的⼆进制代码),也就是说它是可执⾏程序在内存中的镜像。代码段需要防⽌在运⾏时被⾮法修改,所以
只允许读取操作,⽽不允许写⼊操作。它是不可写的。
2.2)常量区
常量存储区,这是⼀块⽐较特殊的存储区,⾥⾯存放的是数字/字符常量。编译时分配,APP结束时由系统释放。
2.3)全局(静态)区
编译时分配,APP结束时由系统释放。全局变量和静态变量的存储是放在这⼀块区域,程序退出后⾃动释放。
数据区(全局初始化区),数据段⽤来存放程序中已经初始化的全局变量和静态变量。
BSS区(全局未初始化区),BSS段包含了程序中未初始化的全局变量和未初始化的静态变量。
2.4)堆(heap)区
堆(FIFO)是由程序开发者分配和释放,地址是从低到⾼分配。⽤于存放进程运⾏中被动态分配的内存段,它⼤⼩并不固定,可动态扩张或缩减。当进程调⽤
alloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利⽤release释放内存时,被释放的内存从堆中被剔除(堆被缩减),因为我们现
在iOS基本都使⽤ARC来管理对象,所以不⽤我们程序员来管理,但是我们要知道这个对象存储的位置。
2.5)栈(stack)区
栈(LIFO)是由系统⾃动分配并释放,地址从⾼到低分配。⽤于存放程序临时创建的局部变量,存放函数的参数值,局部变量等。也就是说我们函数括弧“{}”中
定义的变量(但不包括static声明的变量,static意味这在数据段中存放变量)。
另外在函数被调⽤时,其参数也会被压⼊发起调⽤的进程栈中,并且待到调⽤结束后,函数的返回值也会被存放回栈中。由于栈的先进后出(LIFO)特点,所
以栈特别⽅便⽤来保存/恢复调⽤现场。从这个意义上将我们可以把栈看成⼀个临时数据寄存、交换的内存区。函数跳转时现场保护(寄存器值保存于恢复),这
些系统都会帮我们⾃动实现,⽆需我们⼲预。所以⼤量的局部变量,深递归,函数循环调⽤都可能耗尽栈内存⽽造成程序崩溃 。
剩余14页未读,继续阅读
资源评论
欧生1539
- 粉丝: 21
- 资源: 1
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功