您的位置:首页 > 职场人生

黑马程序员——引用计数器

2014-09-02 01:45 288 查看
----------------------
iOS开发、iOS培训、期待与您交流! ----------------------

引用计数器

1.每个OC对象都有自己的引用计数器,是一个整数,表示“对象被利用的次数”,即有多少人正在使用该对象

2.每个OC对象内部专门有4个字节的存储空间来存储引用计数器

在Person.m中重写dealloc方法

- (void)dealloc

{

NSLog(@"Person对象被回收");

[super dealloc];

}

在main中

int main()

{

Person *p = [[Person alloc] init];

NSUInteger c = [p retainCount];

NSLog(@"%d",c);

 

// 计数器 2 retain返回对象本身

[p retain];

// 1

[p release];

// 0

[p release];// 当计数器为0 时,指针p就是野指针,指向的对象就是僵尸对象

// [p release];// 出错,EXC_BAD_ACCESS:访问了一块坏的内存已经被回收,已经不可用的内存,野指针错误

// [p release];// 解决方法:当p为野指针时,加上p =nil,因为给空指针发消息,不报错

return 0;

}

总结:1.方法的基本使用:1.retain :计数器+1,返回对象本身

    2.release: 计数器-1,没有返回值

    3.retainCount:获取当前的计数器值

    4.dealloc:当一个对象要被回收的时候,就会调用

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

  2.野指针:指向僵尸对象,给野指针发送消息会报错

  3.空指针:没有指向任何东西的指针,给空指针发送消息不会报错

 

内存管理的代码规范

1.只要调用了alloc,必须有release (autorelease)

2.Set方法的代码规范:

1.基本数据类型:直接赋值

- (void)setAge:(int)age

{

_age = age;

}

2.OC对象类型

- (void)setCar :(Car *)car

{

if(car !=_car)

{

[_car release];

_car = [car retain];

}

}

3.dealloc方法的代码规范

1.一定要写[super dealloc],而且放在最后面

2.对self(当前)所拥有的其他对象做一次release

- (void)dealloc

{

[_car release];

[super dealloc];

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: