码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员-内存管理之引用计数器

时间:2014-10-03 20:16:25      阅读:162      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   io   使用   strong   sp   div   c   

1.引用计数器

  每种语言都有自己的内存管理机制,当然OC也不例外。当一个对象创建的时候,系统在堆中给这个对象分配了一块存储区域,这个对象被栈中的对象指针所指向,当没有任何指针指向这个对象的时候,系统怎么释放这块对象内存呢?OC中是用引用计数器来实现的。每一个对象拥有一个引用计数器(占四个字节),当对象被创建时,自带的引用计数器的值就为1了。给对象发送retain消息时,对象的引用计数器就做+1操作,表示有指针拥有这个对象,发送release消息时引用计数器做-1操作,表示某个指针不在拥有这个对象。当对象的引用计数器为0的时候,表示没有任何指针拥有这个对象,系统就会自动调用dealloc方法,销毁该对象。总体来说和c语言中的管理机制差不了多少,无非是多了一些方法调用。

  下面用代码演示一下,创建一个Person类,并对其操作。

1 #import <Foundation/Foundation.h>
2 
3 @interface Person : NSObject
4 
5 @property int age;
6 
7 @end
 1 #import "Person.h"
 2 
 3 @implementation Person
 4 
 5 // 重写dealloc方法,当一个Person对象被回收的时候,就会自动调用这个方法
 6 - (void)dealloc
 7 {
 8     NSLog(@"Person对象被回收");
 9     
10     // super的dealloc一定要调用,而且放在最后面
11     [super dealloc];
12 }
13 
14 @end
#import <Foundation/Foundation.h>
#import "Person.h"

int main()
{
   // 对象创建的时候,引用计数器为1
    Person *p = [[Person alloc] init];
    
   // 获取引用计数器
    NSUInteger c = [p retainCount];
    NSLog(@"计数器:%ld", c);
    
    
    // 调用了retain方法,计数器变成了2 
    Person *p2 = [p retain];
    
    // 调用了release方法,计数器变成了1 
    [p release];

     // 调用了release方法,计数器变成了0,此时系统调用dealloc方法,  释放这块内存
    [p release];

    return 0;

注意:retain方法返回的是对象本身,因为它这个方法本身就是复制对象,如上述代码中的 Person *p2 = [p retain] 就是在栈中分配了一个内容为Person对象地址的指针,也就是指向了Person对象,此时Person对象的引用计数器必须+1,来标记有否个指针在拥有我。

2.野指针,空指针和僵尸对象。

1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用

2>  野指针:指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)

3> 空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错

某些场合会引起僵尸对象和野指针的存在,要理解他们的概念。

 

黑马程序员-内存管理之引用计数器

标签:style   blog   color   io   使用   strong   sp   div   c   

原文地址:http://www.cnblogs.com/pangjiayang/p/4005180.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!