IOS开发基础Object-C(10)—OC内存管理(4)-autorelease使用

来源:互联网 发布:k-means聚类算法python 编辑:程序博客网 时间:2024/05/29 12:19

最想必大家近也是被内存管理整的焦头烂额,大家也就再痛苦这么一下,今天的autorelease已经是内存管理的最后一章了,今天的内容完成我们的内存管理也就先告一段落了。希望大家一定要理解内存管理,因为内存管理在OC中的地位可以说相当于C语言中的指针。虽然现在引进了ARC机制,但是大家也要理解内存管理的过程和原理,否则到时动不动来个内存泄露,而且还找不到错误所在,那感觉.....真(ri)是(le)爽(gou)啊(le)

我们先来理解一个概念:自动释放池(autorelease pool)


自动释放池(autorelease pool)

1、自动释放池是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。

2、OC对象只要是发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶释放池),

3、autorelease其实就是对release延迟调用了,当自动释放池销毁时,释放池里面的所有对象会自动调用一次release方法(注意,是调用一次release方法

学过Java的应该知道,Java中有一个垃圾回收机制,这个内存回收机制其实和Java中的内存回收机制还是不一样的,Java中的垃圾回收机制是不需要我们手动管理内存的,它会自动检测我们的对象需不需要回收,要是这个对象没有被使用的时候,就会被回收。OC中的内存自动回收机制是不可能像Java那样自动检测回收的,还是需要我们手动,也可以说OC中的垃圾自动回收机制是半自动的。为什么是半自动的呢?我们再来详细讲解一下。

老规矩,我们先来建一个Student类

Student.m

#import "Student.h"        @implementation Student           #pragma mark 回收对象    - (void)dealloc{                NSLog(@"%@ 被销毁了", self);                [super dealloc]; }            @end 

main.m

#import <Foundation/Foundation.h>  #import "Student.h"         int main(int argc, const char * argv[])  {          //@autoreleasepool代表创建一个自动释放池    @autoreleasepool {                    Student *stu = [[Student alloc] init];                    [stu autorelease];                } //在此处自动释放池销毁     return 0;  }  

好,只要写了[stu autorelease],stu对象就能放到自动释放池里面了。到自动释放池销毁的时候,stu对象执行一次release。

我们在实际项目中一般这样写

@autoreleasepool {                    Student *stu = [[[Student alloc] init]autorelease];                } //在此处自动释放池销毁

要注意:autorelease并不会改变引用计数器 的值,只是单单把对象放到自动释放池里面,到自动释放池销毁的时候,里面的所有对象统一执行一次release。也就是说自动释放池的销毁并不代表对象销毁,执行一次release只是让引用计数器-1,并不是被销毁。

autorelease pool 的创建

IOS 5.0后

@autoreleasepool {                    //...... }

IOS5.0以前

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];   //......[pool release];


autorelease pool 的注意事项

1.在ARC下,不能使用NSAutoreleasePool创建自动释放池,应该用@autoreleasepool。

2.不要把大量的循环操作放到同一个自动释放池,会造成内存上升

3.避免对大内存使用该方法,应尽量少用这种延迟释放机制

4.SDK中一般利用静态方法创建并返回的对象都是已经autorelease的了,不需要再自动释放了


相关视频链接

http://pan.baidu.com/s/1eQBa5F0


1 0
原创粉丝点击