在 iOS 和 macOS 应用的开发中,无论是使用 Objective-C 还是使用 swift 都是通过引用计数策略来进行内存管理的,但是在日常开发中80%(这里,我瞎说的,8020 原则嘛?)以上的情况,我们不需要考虑内存问题,因为 Objective-C 2.0 引入的自动引用计数(ARC)技术为开发者们自动的完成了内存管理这项工作。ARC 的出现,在一定程度上拯救了当时刚入门的 iOS 程序员们,如果是没有接触过内存管理的开发者,在第一次遇到僵尸对象时一定是吓得发抖???My Brains~。但是 ARC 只是在代码层面上自动添加了内存管理的代码,并不能真正的自动内存管理,以及一些高内存消耗的特殊场景我们必须要进行手动内存管理,所以理解内存管理是每一个 iOS 或者 macOS 应用开发者的必备能力。
本文将会介绍 iOS 和 macOS 应用开发过程中,如何进行内存管理,以及介绍一些内存管理使用的场景,帮助大家解决内存方面的问题,本文将会重点介绍内存管理的逻辑、思路,而不是类似教你分分钟手写 weak
的实现,之类的问题,毕竟大家一般拧螺丝比较多,至于✈️??的制造技艺嘛,还是要靠万能的 Google 了。
本文其实是内存管理的起点,而不是结束,各位 iOS 大佬们肯定会发现很多东西在本文中是找不到的,因为这里的内容非常基础,只是帮助初学 iOS 的同学们能够快速理解如何管理内存而写的。
什么是内存管理
很多人接触到内存管理可以追溯到大学时候的 C 语言程序设计课程,在大学中为数不多的实践型语言课程中相信 C 语言以及 C 语言中的指针是很多人的噩梦,并且这个噩梦延续到了 C++,当然这个是后话了。所以 Java 之类的,拥有垃圾回收机制的语言,也就慢慢的变得越来越受欢迎(大雾???)。
内存管理基本原则:
这里来一段简单的 C 代码~
#define BUFFER_SIZE 128
void dosth() {
char *some_string = malloc(BUFFER_SIZE);
// 对 some_string 做各种操作
free(some_string);
}
这么一句话看起来似乎不是很复杂,但是光这一个内存管理,管得无数英雄尽折腰啊,因为实际的代码并不会像上面那么简单,比如上面我要把字符串 some_string
返回出来的话要怎么办呢?(我不会回答你的?)
iOS 的内存管理
内存引用计数(Reference Counting,RC)以及 MRC
Objective-C 和 Swift 的内存管理策略都是引用计数,什么是引用计数呢?下面是 wiki 上摘抄而来的内容:
引用计数是计算机编程语言中的一种内存管理技术,是指将资源(可以是对象、内存或磁盘空间等等)的被引用次数保存起来,当被引用次数变为零时就将其释放的过程。使用引用计数技术可以实现自动资源管理的目的。同时引用计数还可以指使用引用计数技术回收未使用资源的垃圾回收算法。
当创建一个对象的实例并在堆上申请内存时,对象的引用计数就为1,在其他对象中需要持有这个对象时,就需要把该对象的引用计数加1,需要释放一个对象时,就将该对象的引用计数减1,直至对象的引用计数为0,对象的内存会被立刻释放。