A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© chunhuayun 中级黑马   /  2015-10-6 16:55  /  510 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、内存管理的基本概念及范围
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

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马