这是我参与「第四届青训营 」笔记创作活动的的第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中内存的管理有了一定的了解,今天的学习依然有所进步,但明天还有要学习的内容,还是需要努力。