一、内存管理的基本概念及范围
1、管理范围: 1)管理任何继承NSObject的对象,对其他基本数据类型是无效的。 因为对象和基本数据类型存储的区域是不一样的。对象存储在需要内存管理的堆区,而基本数据类型存放在栈区。 2)对象类型是程序在运行过程中动态分配的,存储在堆区。 内存管理主要是【对堆区中的对象】的内存管理
二、内存管理的原理和分类 1、对象的所有权及引用计数 1)【所有权策略】 任何自己创建的对象都归自己所有,可以使用名字以“alloc”和“new”开头或名字中包含“copy”的方法创建对象,可以使用retain来获取一个对象的所有权
2)【对象的引用计数】retainCount
每个OC对象都有自己的引用计数器,标示【当前对象】当前有多少个东西在使用这个对象,当该对象被创建时,计数器值为1。
3)【引用计数器作用】 是判断对象要不要回收的依据。 如果引用计数器为0,则就要回收该对象。 【例外】对象值为nil时,引用计数器为0,但不回收空间,因为根本就没分配空间
4、【对引用计数器的操作】 给对象发送消息,进行相应的计数器操作 【retain消息】使计数器+1,该方法返回对象本身 【release消息】使计数器-1,并不代表释放对象 【retainCount消息】获得对象当前的引用计数器值 %ld %lu
5、【对象的销毁】 当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收 当对象被销毁时,系统会自动向对象发送一条【dealloc】消息,一般会重写dealloc方法,在这里释放相关的资源。一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用,不能直接嗲用dealloc放啊。 一旦对象被回收,那么他所占据的存储空间就不在可用,坚持使用会导致程序崩溃
【注意】 1)如果对象的计数器不为0,那么在整个程序运行过程中,它所占用的内存就不可能被回收(除非整个程序已经退出) 2)任何一个对象,刚生下来的时候,引用计数器都为1。当使用alloc、new或者copy创建一个对象时,对象的引用计数器默认就是1.
2、OC内存管理的分类 OC中提供了三种内存管理方式:
- Mannul Reference Counting MRC 手动管理方式
- Automatic Reference Counting ARC自动引用计数
- Garbage collection 垃圾回收。但是IOS中不支持该技术
开发中如何使用:需要理解MRC,但是实际尽量使用ARC
|