1、为什么进行内存管理

  提高手机流畅度

  在程序开发中,应该及时将不用的数据回收,合理分配和管理内存,以提高程序的运行效率

规定运行起来的程序所占用的内存不得超过20m

一旦超过 就会发送警告 ,如果app接到警告还没有进行处理的话,程序会闪退

大部分闪退的原因都是因为内存没有管理好

每个界面占用内存累计增加内存占用量

 

2、哪些行为增加内存占用

  1)创建对象

  2)定义变量

  3)调用函数或者方法

 

  堆区,栈区,常量区,代码区...

  能够看到和控制的区域:堆区和栈区

 

3、OC内存管理的范围

  管理任何继承自ONSObject的对象,对其它的基本数据类型无效

对象类型是程序运行过程中动态分配的,存储在堆区内存管理主要是 对堆区的对象的内存管理

 

一、内存管理的原理及分类

1、内存管理的原理

  搞清楚两个概念:

  1)对象的所有权

  任何一个对象,都可能有一个或多个所有者

  如:person *p=[Person new];

  p就是对象的所有者

  Person *p1=p

  p1是p的所有者是对象的所有者

 

  任何自己创建的对象都归自己所有

  new/alloc/copy的方法创建对象,可以使用retain来获得一个对象的所有权

 

  2)引用计数器

  对象刚被创建时,默认计数值为1,当计数器的值变为0的时候,对象被销毁

  (通过retainCount方法可以打印对象引用计数器的值)

 

  MRC:手动内存管理

  ARC:默认环境为ARC:automatic Reference count 自动引用计数器

  怎么配置成MRC形式?

  target->Build Setting  automatic reference Counting (YES/NO)

  a、引用计数器作用:

  判断对象要不要被回收的依据

  b、对引用计数器的操作

  想要管理对象占用的内存,就要学会操作引用计数器

  1)常见操作:

    a、retain消息:计数器+1

    b、release消息:计数器-1

        原则:谁retain谁release

 

2、内存管理

  1、野指针(僵尸对象):

  僵尸对象:已经被销毁的对象

  野指针:指向僵尸对象(不可用内存)的指针

  空指针:没有指向存储空间的指针(里面村的是nil也就是-)

  

  2、内存泄漏

  如果在程序结束后,对象没有被释放,则成为内存泄漏