一. 计算机的基本知识 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)自动释放池的使用场景 放入栈中。此区域的内存由编译器自动分配释放,用于存放函数的参数值,局部变量等。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存有限。 三. 堆和栈的区别 3.1) 申请方式和回收方式 堆内存的申请和释放由程序员手动进行,通常是通过`malloc`、`calloc`、`realloc`、`free`等函数来完成。而栈内存的申请和释放由编译器自动管理,当函数调用结束,栈上的内存就会自动释放。 3.2) 申请后的系统响应 栈内存的申请响应非常快,因为它遵循后进先出(LIFO)的原则,只需要简单的调整栈顶指针即可。而堆内存的申请涉及到更复杂的内存管理,可能需要遍历空闲内存链表,寻找合适大小的空间,因此速度相对较慢。 3.3) 申请大小的限制 栈内存的大小通常受到限制,如在iOS中一般为1MB左右,而堆内存则可以动态扩展,理论上没有大小限制,但实际上受系统可用内存影响。 3.4) 申请效率的比较 栈内存的申请效率高,因为它不需要进行内存碎片整理。而堆内存由于可能存在碎片,申请和释放内存时可能需要进行整理,效率较低。 3.5) 分配方式的比较 栈内存是线性分配,地址从高向低增长;堆内存是链式分配,地址从低向高增长,但可以任意位置释放。 3.6) 分配效率的比较 栈内存的分配和释放效率更高,因为它们的操作相对简单。而堆内存分配和释放涉及到搜索合适的内存块和更新内存分配表,所以效率较低。 四. 内存分配的引入 4.1) 什么行为会增加App的内存占用? - 创建新的对象实例 - 加载大图像或其他资源 - 保留大量数据结构或对象 - 不正确的内存管理,如忘记释放已分配的内存 4.2)内存管理范围 内存管理主要关注程序运行期间对象的生命周期和内存的分配与释放。 4.3)内存管理原因 内存管理的目的是避免内存泄漏,提高程序运行效率,以及合理利用有限的系统资源。 五. Objective-C内存管理 5.1)Objective-C内存管理相关术语 Objective-C中主要有强引用、弱引用、自引用、引用计数等概念。 5.2)什么是引用计数? 5.2.1)引用计数解释 引用计数是Objective-C中管理内存的一种机制,每个对象都有一个计数值,表示有多少个对象持有该对象的引用。当计数值为0时,对象会被自动释放。 5.2.2)文艺解释 引用计数就像人们手中的票,每多一个人持有,票数就加一,当没有人持有时,票就失效,对象也随之消失。 5.2.3)代码测试 可以通过`retain`、`release`、`autorelease`等方法来增加或减少对象的引用计数。 5.3)自动释放池 5.3.1)AutoreleasePool的原理 自动释放池是一种临时存放即将释放的对象的地方,当池被销毁时,池内的所有对象都会被释放。 5.3.2)自动释放池的创建和销毁 在iOS中,每次进入一个新的执行上下文(如在主线程的runloop中),系统都会自动创建一个自动释放池,当退出这个上下文时,自动释放池被销毁。 5.3.3)自动释放池的使用场景 常见于循环中创建大量临时对象的情况,这样可以避免每次创建都直接分配到堆上,提高效率。 5.4)MRC手动管理引用计数 在MRC模式下,对象的内存管理完全由程序员控制,需要手动调用`retain`、`release`等方法。 5.4.1)对象操作 程序员需要在适当的时候增加或减少对象的引用计数。 5.4.2)四个法则 - 谁创建谁释放 - 谁拥有谁释放 - 强引用不交叉 - 不要忘记释放 5.4.3)非自己生成的对象,且该对象存在,但自己不持有 在这种情况下,可以使用`assign`属性,而不是`strong`,以避免无意中增加对象的引用计数。 5.5)ARC自动管理引用计数 Objective-C的ARC(Automatic Reference Counting)机制自动处理对象的引用计数,减少了内存管理的负担。 5.5.1)ARC介绍 ARC是在编译时插入适当内存管理代码的机制,确保对象的引用计数正确。 5.5.2)所有权修饰符 ARC使用`strong`、`weak`、`unowned`等修饰符来表示对象的所有权关系。 5.6)循环引用 循环引用是两个或多个对象相互引用,导致它们的引用计数永远不会降为0,从而引发内存泄漏。 5.7)Core Foundation 对象的内存管理 Core Foundation对象也需要内存管理,通常使用`CFRetain`、`CFRelease`等函数。 5.8)总结 了解并掌握内存管理是开发iOS应用的关键,合理的内存管理能确保应用的性能和稳定性。无论是手动的MRC还是自动的ARC,都需要开发者对内存管理有深入的理解,防止内存泄漏和意外崩溃。
剩余14页未读,继续阅读
- 粉丝: 22
- 资源: 1
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- (源码)基于Java和MySQL的学生信息管理系统.zip
- (源码)基于ASP.NET Core的零售供应链管理系统.zip
- (源码)基于PythonSpleeter的戏曲音频处理系统.zip
- (源码)基于Spring Boot的监控与日志管理系统.zip
- (源码)基于C++的Unix V6++二级文件系统.zip
- (源码)基于Spring Boot和JPA的皮皮虾图片收集系统.zip
- (源码)基于Arduino和Python的实时歌曲信息液晶显示屏展示系统.zip
- (源码)基于C++和C混合模式的操作系统开发项目.zip
- (源码)基于Arduino的全球天气监控系统.zip
- OpenCVForUnity2.6.0.unitypackage