17 - 内存管理方案之MRC和ARC

2021-11-13  本文已影响0人  iOS之文一

OC底层原理探索文档汇总

在上文我们知道了内存的五大区域组成,接下来了解对于内存的管理。

内存管理其实就是管理堆

因为分配堆的空间大小不确定,而且它的生命周期不确定,需要人为管理。
栈的数据虽然也是运行时临时分配的,但是其会在方法调用结束后自动回收,所以无需关注。
全局区/静态区和常量区、代码区的生命周期都是APP运行的整个过程,所以系统会在APP运行结束后自动回收。

因此我们常说的内存管理很大程度上就是指管理堆

引用计数的认识

iOS提供引用计数方式来管理内存,当计数器为0时,就表示这个对象就成为了垃圾对象,系统会在合适的时候进行回收。

引用计数的时机:

文艺的解释

记得在《寻梦环游记》里对于一个人的死亡是这样定义的:当这个这个世界上最后一个人都忘记你时,就迎来了终极死亡。类比于引用计数,就是每有一个人记得你时你的引用计数加1,每有一个人忘记你时,你的引用计数减1,当所有人都忘记你时,你就消失了,也就是从内存中释放了。

如果再深一层,包含我们后面要介绍的ARC中的强引用和弱引用的话,那这个记住的含义就不一样了。强引用就是你挚爱的亲人,朋友等对你比较重要的人记得你,你的引用计数才加1。

而弱引用就是那种路人,一面之缘的人,他们只是对你有一个印象,他们记得你是没有用的,你的引用计数不会加1。当你挚爱的人都忘记你时,你的引用计数归零,你就从这个世界上消失了,而这些路人只是感觉到自己记忆中忽然少了些什么而已。

MRC手动引用计数

早期需要手动管理,也就是手动对引用计数进行加减,现在都是在系统自动进行引用计数的管理。

注意:

ARC自动引用计数

ARC简单来说就是系统帮我们自动加上release(autoRelease)和retain方法,不需要手动添加。

注意:当对象没有强指针引用时,会被回收,注意这里一定要是强指针,因为有弱指针,也会被立即回收

所有权修饰符

使用ARC时,处理对象类型或id类型时,一定要加上所有权修饰符,没有加的话就默认是__strong,即强引用

属性修饰符

分别查看不同的属性修饰符它们所代表的所有权修饰符是什么

默认的关键字为:
引用类型:@property (atomic,readWrite,strong) UIView *view;
基本数据类型:@property (atomic,readWrite,assign) int *aa;

野指针和僵尸对象

野指针

指向一个已经被删除的对象或者访问受限内存区域的指针就是野指针

注意:野指针不是nil指针,而是指向了垃圾内存的指针

野指针的场景:

僵尸对象

一个已经被释放掉的对象就是僵尸对象
一个OC对象的引用计数为0,调动dealloc后释放之后,就是僵尸对象。
一个对象虽然被释放掉了,但是数据依然在内存中,所以如果通过野指针去访问僵尸对象,一旦这个僵尸对象的内存已经被分配给其他人了,就会出错。

为什么不开启僵尸对象检测?
这样每次通过指针访问对象的时候都会检查是否为僵尸对象,这样很影响效率

上一篇下一篇

猜你喜欢

热点阅读