iOS内存管理学习笔记一

简介: 1、引用计数引用计数就是当前的对象被多少个其他对象所引用。这是我自己的理解。MRC:手动引用计数,开发者自己来计算每一个对象被引用了多少次,自己进行内存的释放。

1、引用计数
引用计数就是当前的对象被多少个其他对象所引用。这是我自己的理解。
MRC:手动引用计数,开发者自己来计算每一个对象被引用了多少次,自己进行内存的释放。
ARC:自动引用计数,编译器(xcode)来计算每一个对象的引用次数,对象由编译器来决定什么时候释放。
进一步说,所谓的ARC就是编译器帮我们在代码的合适位置插入了retain和release等MRC需要开发者手动写的关于对象引用计数的代码。
ARC环境:
1>xcode4.2或以上版本
2>LLVM3.0以上的编译器
3>编译器选项中设置ARC为有效

2、理解引用计数
举个简单的例子(可能不是那么贴切):
假如工作室里只有一盏灯,每个上班的员工上班时间都需要开灯,下班时间都需要关灯。假如有很多人上下班,最早上班的人A开了灯,A工作了八个小时下班了,把灯关掉,这样的话,没有下班的其他人都会处在一片黑暗之中。这样显然是不合理的,那么该如何解决呢?
解决这一问题是在办公室至少还有一人的状态下保持开灯,在最后一个人离开办公室的时候关灯。
我们来捋一下这个过程:
1>第一个进来的人需要照明,开灯
2>之后进来的人需要照明
3>下班离开办公室的人不需要照明
4>最后一个离开办公室的人不需要照明(此时已经无人需要照明),关灯
我们可以使用“引用计数”来判断办公室里是否还有人需要照明。过程如下:
1>第一个人进来了,需要照明,引用计数从0变为1,要开灯
2>第二个人进来了,需要照明,引用计数从1变为2
3>第一个人离开了,不需要照明,引用计数从2变为1
4>第二个人离开了,不需要照明,引用计数从1变为0,关灯
总结:只要引用计数=0,就是关灯状态,否则就是开灯状态。
在OC中,“对象”就是照明设备,那些使用该对象的“环境”就相当于需要照明的人。
开灯——生成对象(alloc,new,copy等)
需要照明——持有对象(retain等)
不需要照明——释放对象(release)
关灯——废弃对象(地址被回收,这个对象烟消云散了)

下面是个人理解的对象生命周期:
Person是一个类

Person * xiaoming = [[Person alloc]init];

这个时候再内存中开辟了一块内存空间,并初始化这个对象。引用计数从0变为1,相当于开灯。

img_2572694a52ca6d490419d1312c7ae2f9.png
image.png
Person * xiaohong = xiaoming;

这时候引用计数要增加了。相当于又有人需要照明,引用计数 = 2.

img_8b6864f158ee6e8868abc92db8e1bf09.png
image.png

然后xiaohong在使用完这个对象之后就把对象释放了。现在引用计数-1,引用计数=1

[xiaohong release];
img_3b5a8411b8a9e1e41f95691f116456c8.png
image.png

xiaoming在使用完这个对象的时候也进行了释放。相当于不需要照明,引用计数-1,引用计数 = 0 .

[xiaoming release];
img_fd1b36a1788c96f8b8cad34596b4b8e0.png
image.png

这个时候,系统发现引用计数已经等于0了,这块空间需要释放回收了,回到最初的状态,于是变成下图的样子。

img_fde72506812df1aaf262a1fba28a5542.png
image.png

在这里简单说说内存泄漏的情形吧。
内存泄漏就是有些地址已经不使用了,但是依然有指针指向它导致这块地址空间不能释放。如下图所示:

img_a34077c073130bd517027d1ce302dc80.png
image.png

这是我自己的理解,如有不妥之处还请各位不吝赐教。如果您看到这篇文章,对您有一点点的帮助,将是我最开心的事!

目录
相关文章
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
【深入理解计算机系统】int 不是整数 | float 不是实数 | 内存引用错误的例子 | 学习笔记
75 0
|
3月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
48 0
|
5月前
|
存储 编译器 C语言
【C++】学习笔记——内存管理
【C++】学习笔记——内存管理
56 15
|
5月前
|
存储 C++
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
C primer plus 学习笔记 第12章 存储类别、链接和内存管理
|
存储 缓存 Linux
计算机操作系统学习笔记(5)——内存管理
计算机操作系统学习笔记(5)——内存管理
113 0
|
NoSQL Redis
Redis学习笔记-内存碎片对性能的影响
Redis学习笔记-内存碎片对性能的影响
103 0
|
存储 缓存 算法
十五、Linux性能优化实战学习笔记 - Linux内存是怎么工作的
内存管理也是操作系统最核心的功能之一。内存主要用来存储系统和应用程序的指令、数据、缓存等
304 1
|
存储 缓存 NoSQL
二十一、Linux性能优化实战学习笔记- 如何“快准狠”找到系统内存的问题?
已用内存、剩余内存、共享内存、可用内存、缓存和缓冲区的用量。
136 0
|
存储 缓存 Linux
十八、Linux性能优化实战学习笔记- 内存泄漏了,我该如何定位和处理?
当进程通过 malloc() 申请虚拟内存后,系统并不会立即为其分配物理内存,而是在首次访问时,才通过缺页异常陷入内核中分配内存.对应用程序来说,动态内存的分配和回收,是既核心又复杂的一个逻辑功能模块。管理内存的过程中,也很容易发生各种各样的“事故”.
120 0
|
存储 缓存 BI