黑马程序员——引用计数器
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];
}
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];
}
相关文章推荐
- 黑马程序员---03引用计数器的基本使用
- 黑马程序员_object c学习日记③_SEL数据、内存管理一:引用计数器、retain、release、dealloc等
- 黑马程序员---内存管理之引用计数器
- 黑马程序员-内存管理之引用计数器
- 黑马程序员——OC基础---内存管理(引用计数器,多对象内存管理,set方法的内存管理,模型设计,循环引用)
- 黑马程序员——OC基础:内存管理和自动引用计数(ARC)
- 黑马程序员_java中值传递和引用传递区别
- 黑马程序员——java面向对象的概念,Java类、引用变量与堆对象
- 【黑马程序员】C#笔记之值类型和引用类型
- string奇怪引用计数器
- OC_语法入门_day5_内存管理_计数器/set方法/property的参数/循环引用/自动释放池
- 黑马程序员_软件计数器
- Objective-C - 自动引用计数器
- 黑马程序员-Java传值与传引用
- netty 引用计数器 ,垃圾回收
- 黑马程序员---在HTML文档中引用CSS有几种方式?请指出它们分别是什么?
- 理解php内核的 引用计数器与写时复制
- 黑马程序员_java中特殊的引用类型(对第十三课String类和包装类总结)
- Netty之引用计数器
- linux中的内核引用计数器