1、什么是内存管
程序在运行时候,一下行为会增加程序所占内存:
——创建一个对象
——定义一个变量
——调用一个函数或者方法
然而设备内存是有限的,而且每个应用程序所可以占用的内存也是有限的
当程序所占用的内存较多时,系统就会发出内存警告,这时就得回收一些不需要再使用的内存空间。比如回收一些不需要使用的对象、变量等
如果程序占用内存过大,系统可能会强制关闭程序,造成程序崩溃、闪退现象,影响用户体验
所以这个时候需要内存管理来尽量降低内存的使用率来保证程序的正常运行和高效。
任何继承自NSObject 的对象都需要进行内存管理
而其他非继承NSObject对象的数据类型(nt、char、float、double、struct、enum等)则不需要内存管理
非对象不需要内存管理的原因:
原因是这些数据类型存储在栈里面,栈理的数据有系统自动分配释放。
内存管理的机制:引用计数
引用计数器:
每个OC对象都会有一个引用计数器,引用计数器的值是整数,表示对象被引用的次数,即这个对象在多少个地方被使用。
引用计数器的增减:
给对象发送消息,进行相应的计数器操作。
Retain消息:使计数器+1,改方法返回对象本身
Release消息:使计数器-1(并不代表释放对象)
retainCount消息:获得对象当前的引用计数器值
alloc:当一个类的对象创建,需要开辟内存空间的时候,会使用alloc,alloc是一个类方法,只能用类调用,它的作用是开辟一块新的内存空间,并使这块内存的引用计数从0增加到1,注意,是新的内存空间,每次用类alloc出来的都是一块新的内存空间,与上一次alloc出来的内存空间没有必然联系,而且上一次alloc出来的内存空间仍然存在,不会被释放。
对象的销毁:
当OC对象的引用计数为0的时候,它将被销毁,其所占用的内存将被系统回收。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在此方法里面释放 相关资源,dealloc方法里面必须调用“ [super dealloc]; ”方法,并且在最后调用。一旦对象被销毁,就不能 在使用它之前所占据的空间,坚持使用会造成崩溃(野指针错误)。
内存管理的原则:
1⃣️、一个对象还在就不能被回收。
2⃣️、一个地方使用这个对象,这个对象就引用计数 +1
3⃣️、当你不在使用这个对象的时候,这个对象的引用计数 -1
谁创建,谁release:
1⃣️、如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者autorelease方法
2⃣️、不是你创建的就不用你去负责
谁retain,谁release
只要你调用的retain,那么无论这个对象是什么时候生成的,你都要调用release方法。
2、自动内存管理
内存管理模型
给OC程序员的内存管理模型有三种
(1)自动垃圾手机(iOS环境不支持)
(2)手动引用计数和自动释放池(MRC)
(3)自动引用计数器(ARC)
一、手动内存管理(Manual Reference Counting 简称:MRC)
1、引用计数器
系统会在一个OC对象的引用计数为0时,销毁这个对象并回收其所占内存释放该空间。
当使用alloc ,retain 和 copy 创建一个对象的时候,其默认的引用计数就是1。
2、引用计数器操作
每当创建引用到对象就会给对象发送一个retain消息,使得引用计数+ 1
网友评论