学习笔记:Objective C 的内存管理(1)----引用计数器

来源:互联网 发布:java ee eclipse教程 编辑:程序博客网 时间:2024/05/18 03:54

一、基本原理

(一)什么是内存管理

由于手机内存有限,一个app不应占用较大的空间,所以需要管理内存,回收不需要使用的内存空间。

管理范围:任何集成了NSObject的对象,对于其他基本数据类型无效。

本质:堆中存放对象,栈中存放局部变量。栈中数据会自动回收,堆中的对象则需要自己手动回收。

在之后的Xcode版本中存在ARC机制(Automatic Reference Counting)自动引用计数。

(二)对象的基本结构

每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,此引用计数器占4个字节

(三)引用计数器的作用

当使用alloc,new或者copy创建一个新对象时,新对象的引用计数器默认是1

当引用计数器值为0时,对象占用的内存就会被系统回收。

(四)引用计数器的操作

给对象发送一条retain消息,可以使引用计数器+1(retain方法返回对象本身)

给对象发送一条release消息,可以使引用计数器-1

给对象发送retainCount消息获得当前计数器值。

(五)对象的销毁

当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法释放相关的资源,

一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直接调用dealloc方法)。

一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指针错误)。


基本操作举例:



重写dealloc方法:



(六)僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用。

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

   空指针:没有指向任何东西的指针(nil  NULL  0)。




当计数器为0时,对象已经被回收,此时如果再次执行[p release]即再次访问不存在的空间就会报错,错误如下:

  表示访问了坏的内存。

所以当对象回收后,应该将野指针清空:p = nil; (注意:给p空指针发送release消息时,OC中不报错),如果发现

使用野指针发送消息时没有报错,那是因为没有勾选软件设置中的检测僵尸对象的选项,勾选上即可。

注意:不能使用[p retain]让对象起死回生。


二、内存管理原则

1、   原则分析

        只要有人在用某个对象,这个对象就不会被回收。

        只要想用这个对象,就让对象的计数器+1。

        当不再使用此对象时,就让对象的计数器-1。

2、谁创建,谁release

如果通过alloc,new,[mutable]copy来创建一个对象,那么必须调用release,或autorelease。

3、谁retain,谁release

只要调用了retain,无论对象是如何生成的,都要调用release。

4、总结

曾经让对象的计数器+1,就必须让对象的计数器-1。







0 1