黑马程序员技术交流社区

标题: 简单总结了内存管理——引用计数器 [打印本页]

作者: AngleMGG    时间: 2014-9-22 22:40
标题: 简单总结了内存管理——引用计数器
内存管理总结

一、内存分5大区域,其中两大区域是堆和栈;
栈:存放局部静态变量,存储空间不需要手动回收;
堆:存放动态产生的对象,需要进行内存管理释放空间;

二、内存“管理工具”——引用计数器
1、每个OC对象都有一个int类型引用计数器,表示“对象被引用的次数”。
2、引用计数器在对象内部占据4个字节的存储空间;
3、使用alloc、new或者copy创建新对象,对象引用计数器值为1;
4、当对象的引用计数器值为0时,对象所占内存被回收——这就是内存管理的条件;
5、对引用计数器的操作:
        [对象名 retain]使对象计数器值+1;
        [对象名 release]表示对象计数器-1;
        [对象名 retainCount]返回对象当前计数器值;


三、内存管理代码书写规范:
1、alloc与release成对出现;
1)、只要调用了alloc,必须有release出现;
int main()
{
        Dog *d = [[Dog alloc] init];
        ……
        [d release];       
        return 0;
}

2)、如果对象不是通过alloc产生的,就不需要release;
int main()
{
        NSString *s = @“jonh”;
        ……
        return 0;
}

2、set方法的代码规范

1)、基本数据类型:直接赋值,不需要管理内存;
- (void)setAge:(int)age
{
        _age = age;
}

2)、OC对象类型
- (void)setDog:(Dog *)dog
{
        //1、先判断传入的对象是不是新的,如果传入的对象是旧的则不接收该对象
        if ( dog != _dog)
        {
                //2、对旧对象做一次release,释放就对象以便接收新对象
                [_dog release];

                //3、对新对象做一次retain
                _dog = [dog retain];
        }
}

3、dealloc方法的代码规范

1)、一定要有[super dealloc],而且必须放在最后面;
2)、对self(当前)所拥有的所有其他对象做一次release
- (void)dealloc
{
        [_car release];
        [_cat release];
        [_dog release];
        [super dealloc];
}


简单的总结可以规范代码书写,方便理解内存管理的本质。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2