OC_浅谈Object-C的内存管理机制

本文深入探讨了Objective-C的内存管理机制,包括自动内存管理和手动内存管理。自动内存管理主要涉及autorelease和autoreleasepool的概念,而手动内存管理则关注release和retain函数的使用。当对象的引用计数器为0时,内存才会被释放。同时,文章提到了dealloc方法在对象释放前的作用,并提供了一个应用实例来展示内存管理原则的实践。

和C++一样通过内存操作获得的空间在使用完毕后需要释放内存否则就会造成内存泄露,接下来就让我们一起看看OC的内存管理机制;
首先我们知道oc的内存管理分为两部分:1、自动内存管理。2、手动内存管理。好,接下来我们就分别从这两个方面来探讨oc的内
存管理机制
在介绍具体具体的管理方法前,我先讨论一些概念性的问题:
1、对象:什么是对象?
标准定义:对象就是客观世界存在的人、事、物体等实体在计算机逻辑中的映射。说实话看完这句话,我想大多数读者应该和我一样
一头雾水,似懂非懂。依照我的理解(不谈客观世界,只在计算机逻辑内理解),我觉得对象其实就是一段内存里的保存的一些数据
组成的一个程序运行单位,而这段内存里的数据是根据事先定义好的类来创建的,里面包含有成员变量,还包含有成员函数(不包含
静态函数)。
2、引用:什么是引用?
对于每一个对象,我们已经知道他就是一段内存数据。那我们应该如何使用这段内存呢?(例如,现在你的盆友站在一旁,你盆友这
人的实体已经存在,可是你如何与他让他过来,帮你的忙呢?这时候可能会有读者会说:把他叫过来不就好了吗?很对,你要叫他就
必须有一个称谓.....)其实每一个对象都有“称谓”,有时不止一个。而这个“称谓”就是对象的引用。
3、引用计数器:什么是引用计数器?
既然每个对象都有引用,这时候就需要对象内部包含另外一个对象,而这个对象就是记录了他所在的这个对象现在又几个引用。
4、--------------------
好了,既然我们已经了解了一些基本概念,那么就让我们回过头来再讨论内存的管理。系统会在什么时候来回收内存呢?学过Java的
读者知道Java是自动内存管理的,一旦没有引用指向一个对象,就说明次对象已经丢失再也找不回来了,这个时候就会自动释放这个
对象所在的内存。而学过C++的读者知道,一个C++对象必须手动的释放内存,才可以,否者即使对象已经丢失无法找回,内存也不会
释放,进而造成内存泄露。OC是如何管理内存的呢?其实OC是根据引用计数器来管理内存的,只有当引用计数器为0时,内存才会释放
,其他情况内存都不会释放(引用计数器为0时,就算还有引用指向对象,内存也会释放。同样的,如果引用计数器不为0,就算已经
没有引用指向对象,内存也不会释放--->内存泄露)。
一、自动内存管理
autorelease:
在创建对象时,在外层声明autorelease,此时此对象就会变成自动释放的对象。但是我们必须说明,使用autorelease虽然是自动释放
但并不是立即释放,而是延迟释放。那么既然是延迟释放,那究竟是在什么时候释放的呢?说这个问题之间我们必须首先探讨一个问题:
autorelease到底对创建的对象做了什么?其实我们在对新建的对象进行autorelease操作时,就是将新建对象加入到了autoreleasepool
栈。那么感慨是的问题就明白了,每当一个autoreleasepool执行完毕时,加入到autoreleasepool中的对象都会被释放掉
二。手动内存管理
其实手动内存管理就是对两个函数的使用release和retain。
我们知道当使用alloc进行对象创建时,会把对象的引用计数器置为1,其实还有一个函数可以使对现代引用计数器加一,那就是retain,
每当我们调用retain函数时,对象的引用计数器就会加一。
我们每当将对象释放时都会调用release函数,那么调用了release函数后对象就一定会被释放吗?答案显然是否定的。其实,我们每次
调用release时都是让对象的引用计数器减一,当我们调用了release后,对象计数器肯定也减一,但是如果计数器的值在减一后还是
大于0那么对象就不会被释放。所以,引用是否会被释放,不在于是否调用了release函数,而是引用计数器是否为0.再提醒一点,如果
内存已经释放,再调用release的话就会报异常。
三、dealloc方法
dealloc方法是一个由编译器调用的方法,程序员不能再外部或内部调用。
每当一个对象被释放时,这个函数都会被自动调用,也就是说,这个函数一定会被调用,而且一定是此对象最后调用的一个函数。
因此如果你有神马操作想在对象释放前操作,就写在这个函数里吧
四、应用实例
假如说我们声明了以下类:

@interface Student : NSObject                    //设计一个学生类
Teacher *tec;                                    //有一个老师类型的成员变量
.......
.......
-(void)setTeacher:(Teacher*) newTec;  //老师成员变量的set方法
.......
@end

@implementation

-(void)setTeacher:(Teacher*) newTec{
    tec = newTec;
    [tec retain];
}

.......
.......
-(void)dealloc(){
    [tec release];
    [super dealloc];
}

@end

总之,内存管理一条原则:谁创建,谁释放;谁污染,谁治理;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值