OC中的内存管理—MRC

来源:互联网 发布:淘宝集市c店免费活动 编辑:程序博客网 时间:2024/05/16 10:27

为什么要进行内存管理?

对于内存,不同的编码语言的处理方法是不同的,在C#中,我们不需要去特意的处理内存问题,因为你写的东西跑在电脑上,里边的内存足够处理你写的系统产生的一系列内存(C#自带垃圾回收机制,对于需要释放的内存系统会自动释放)。可是在移动端,我们的手机、平板里边的内存相对于电脑较小,为了不让手机内存被不需要的垃圾信息塞满,我们必须对内存有一个很好的处理优化。
对于OC来说,系统提供了自动管理机制ARC,那么有了自动管理机制,我们还要去学手动的内存管理机制干什么呢?,在Xcode4.1以及以前的版本中,ARC还没有出现,程序员必须手动的去管理内存。也就是MRC。

有了ARC为什么还要学MRC呢

既然ARC可以自动管理内存,为什么我们还要学习MRC呢?这是因为我们对于内存管理的理解都是在MRC中得来的,因为如果你把内存管理交给了系统,还怎么去理解呢,多使用才能理解的更深。要对内存有很深的理解,不然的话做出来的App的质量就有待商榷了,再一个对于以后转C++也比较容易。

MRC的原理

A进了教室,把灯打开了学习,然后B也来了,他不用开灯就能使用灯的光,现在A要走了,因为是A开的灯,他把灯关了,那B就用不了了,B肯定得骂A。怎么解决这个问题呢,A走的时候看一下还有人在,就不关灯了,B走的时候发现没人了,灯就可以关了并且不会引起纠纷。
在A进去的时候可以在灯的开关上写上个数字1,表示现在有一个人用,B进去的时候加一为二,表示现在有两人用。A走的时候减一,还有一就不关灯,B走时候再减一,为0了,表示没人用了,这时候就可以关灯了。
在OC中,开关上的数字使用计数器来表示。
1. retain表示加一;
2. release表示这个指针释放对他的使用,减一。
3. autorelease表示将其放入内存释放池(autoreleasepool)中,在出内存释放池的时候,这个对象的引用计数减一。


示例:
// 假设Person是自定义的一个类
Person *person1=[[Person alloc]init]; // 创建出的新对象的计数器会自动加一,为1
@autoreleasepool { // 内存释放池的开始
NSLog(@"%d",(int)[person1 retainCount]); //retainCount可以显示出计数器的值
Person *person2=[person1 retain]; //此时引用计数器加一,为2
NSLog(@"%d",(int)[person1 retainCount]);
Person *person3=[person1 retain]; //引用计数器加一,为3
NSLog(@"%d",(int)[person1 retainCount]);
[person1 release]; //引用计数器减一,为2
NSLog(@"%d",(int)[person1 retainCount]);
[person1 autorelease]; //对其进行autorelease操作
NSLog(@"%d",(int)[person1 retainCount]); //发现没有减一还是2
} // 出内存释放池
NSLog(@"%d",(int)[person1 retainCount]); //发现在这里减了一变成1
[person1 release] //再将计数器减一,就变为了0,将释放person1这个对象所占的内存;
注意:
NSLog(@"%@",person1) //再次调用person1时候,系统就会崩溃;


对于上面的例子,我们了解了内存管理中计数器的用处,在MRC中就是要将创建的对象全部释放掉。

我们可以按着Command+Shift+B检查内存释放是否完全。

0 0
原创粉丝点击