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

来源:互联网 发布:网络教育报哪个专业好 编辑:程序博客网 时间:2024/05/16 23:53

黑马程序员——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];}


 

0 0