Objective-C内存管理|青训营笔记

146 阅读3分钟

这是我参与「第四届青训营 」笔记创作活动的的第5天,今天是7月27日,今天青训营老师进行了有关Objective-C内存管理的知识讲解,对课上的知识点进行了整理归纳。

Stack 栈

存储push 销毁Pop

用于存储参数/局部变量/函数调用后返回的地址,是一个线程安全的一块内存。

Stack Pointer:指向栈的位置,保存在寄存器中,永远指向栈顶

由高地址向低地址拓展

Heap 堆

与Heap数据结构无关

用于存储数组和对象,线程是共享的

需要我们自己分配Heap中的内容

由低地址向高地址拓展

Reference Counting 引用计数

用于记录了当前内存资源中有多少指针在被引用(可以访问这个资源)

当新增加一个可以访问这个资源的引用,计数器会加1,反之会减去1。也就是说每有一个指针的资源被引用,计数器+1,反之-1.

当引用计数=0时,对象会被销毁(对象不被引用时),如果对象没有完全释放,引用计数永远大于1,一直占用在堆内存中分配的空间

iOS内存管理

核心:管理(强)引用计数

管理什么:任何继承NSObject的对象(对象会在堆中分配空间)

为什么要管理:多个对象之间互相引用,导致内存无法释放,系统无法回收内存空间,可能导致占用内存过多,从而导致系统强制关闭程序,造成crash。提前释放指针,会导致产生野指针,也会造成crash

ARC

ARC:帮助我们自动处理内存管理

ARC销毁时机:当强引用个数=0时(不是引用个数=0),只要有一个强引用指向该对象,该对象就不能被销毁

所有对象变量的指针默认为强指针,弱指针需手动显式声明

弱指针:__weak 对象类型 对象名=[对象类型 new];

@property 修饰符

Strong

指向并拥有该对象(强持有的关系,会调用copy方法)用于OC对象,相当于MRC中的retain。

weak

指向但不拥有该对象(弱持有的关系)用于OC对象,相当于MRC中的assign。

copy

修饰一个不可变的对象,拥有属性对象的拷贝。

当赋值参数为不可变类型时,copy只是对参数做了一次浅拷贝,地址不变

但赋值参数为可变类型时,copy对参数进行了一次深拷贝,生成一个新的对象,地址改变

assign

用于修饰基本数据类型,指定setter使用简单赋值

总结

今天了解到了有关OC内存管理的一些基础知识,对OC中内存的管理有了一定的了解,今天的学习依然有所进步,但明天还有要学习的内容,还是需要努力。