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

黑马程序员——OC内存管理(一)

2014-11-22 09:47 232 查看
黑马程序员——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];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: