黑马程序员——OC基础---基础语法(一)
------- android培训、ios培训、期待与您交流! ----------
内容概括:
一、内存管理
1、每个对象内部都有4个字节空间来存放他自己的引用计数器,计算有多少人使用他,数据为0时,对象被销毁。
2、引用计数器操作。
1.给对象发送一条retain消息,使计数器值加一,返回对象本身。
2.给对象发送一条release消息,使计数器值减一,没有返回值。
3.给对象发送一条retaincount消息,获得当前计数器值。
3、对象的销毁。
1.当一个计数器值为0时,它将被销毁,系统会自动向对象发送一条 dealloc消息。
2.一般会重写dealloc方法,在这里释放相关资源,dealloc方法就像对象的遗言。
3.一旦重写了dealloc方法,就必须调用[supper dealloc],并且放在最后面调用。
4、注意点
1.一个alloc方法对应一个release方法。
2.一个retain方法也对应一个release方法。
名词概念:
僵尸对象:所占内存已经被回收的对象,僵尸对象不能再使用。
野指针:指向将是对象的指针,给野指针发消息会报错。
空指针:没有指向任何东西的指针,存储的内容是(nil、NULL、0)给空指针发消息不报错。
内存管理的原则:
1.你想使用(占用)某个对象时,就应该让对象的计数器加一。
2.你不想再使用(占用)某个对象时,就应该让对象的计数器减一。
3.谁retain,谁release。
4.谁alloc谁release。
经典示例:
{代码:人换车程序}
@implementation Person
- (void)setCar:(Car *)car
{
if (car != _car)
{
// 对当前正在使用的车(旧车)做一次release
[_car release];
// 对新车做一次retain操作
_car = [car retain];
}
}
- (Car *)car
{
return _car;
}
- (void)setAge:(int)age
{ // 基本数据类型不需要管理内存
_age = age;
}
- (void)dealloc
{
// 当人不在了,代表不用车了,对车做一次release操作
[_car release];
NSLog(@"%d岁的Person对象被回收了", _age);
[super dealloc]; // 调用父类方法。
}
@end
总结与心得:遇到不用的对象,立刻释放内存以提升性能。
内存管理代码规范:
1、只要调用了alloc,就一定有release(autorelease),对象不是alloc产生的不用release。
2、set方法代码规范
1> 基本数据类型,直接复制。
- (void)setAge:(int)age
{
-age = age;
}
2> OC对象类型
- (void)setCar:(Car *)car
{
if(car != _car)
{
//对就对象做一次release。
[_car release];
_car = [car retain];
}
}
3、dealloc方法代码规范
1> 一定要有[supper dealloc],而且放到最后面。
2> 对self(当前对象)所拥有的其他对象做一次release。
- (void)dealooc
{
[_car release];
[supper dealloc];
}