首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

NSAutoReleasePool运用中drain和release的区别

2013-03-21 
NSAutoReleasePool使用中drain和release的区别虽然ARC引入之后NSAutoReleasePool的使用有了很大变化,但是

NSAutoReleasePool使用中drain和release的区别

虽然ARC引入之后NSAutoReleasePool的使用有了很大变化,但是了解NSAutoReleasePool的机制还是十分必要的,下面主要说一下:

NSAutoReleasePool * pool = [NSAutoReleasePool alloc] init];

//do something

之后,

[pool drain] 和 [pool release] 的区别:

release,在引用计数环境下,由于NSAutoReleasePool是一个不可以被retain的类型,所以release会直接dealloc pool对象。当pool被dealloc的时候,pool向所有在pool中的对象发出一个release的消息,如果一个对象在这个pool中autorelease了多次,pool对这个对象的每一次autorelease都会release。在GC环境下release是一个no-op操作(代表没有操作,是一个占据进行很少的空间但是指出没有操作的计算机指令)。

drain,在引用计数环境下,它的行为和release是一样的。在GC的环境下,这个方法调用objc_collect_if_needed出发GC。

因此,重点是:在GC环境下,release是一个no-op,所以除非你不希望在GC环境下出发GC,你都应该使用drain而不是使用release来释放pool。

?

?

1. NSAutoreleasePool实际上是个对象引用计数自动处理器。NSAutoreleasePool可以同时有多个,它的组织是个栈,总是存在一个栈顶pool,也就是当前pool,每创建一个pool,就往栈里压一个,改变当前pool为新建的pool,然后,每次给pool发送drain消息,就弹出栈顶的pool,改当前pool为栈里的下一个 pool。

?

2. 在程序的入口main函数就调用NSAutoreleasePool,这样保证程序中不调用NSAutoreleasePool,但在退出时自动释放。新开线程最好实现NSAutoreleasePool

?

3. NSAutoreleasePool的管理范围是在NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];与[pool release];之间的对象

?

4. NSAutoreleasePool *pool=[[NSAutoreleasePool alloc] init];?

当执行[pool autorelease]的时候,系统回进行一次内存释放,把autorelease的对象释放掉,如果没有NSAutoreleasePool , 那这些内存不会释放

注意,对象并不是自动被加入到当前pool中,而是需要对对象发送autorelease消息,这样,对象就被加到当前pool的管理里了。当当前pool接受到drain消息时,它就简单的对它所管理的所有对象发送release消息。

?

例如

?

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

?

NSString* nsstring;

char* cstring = "Hello CString";

nsstring = [NSString stringWithUTF8String:cstring];

?

[pool release];

?

?

?

5. alloc的对象必须显示释放

?

例如:

NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

?

NSString* string = [[NSString alloc] init];

[string stringByAppendingString:@"Hello World!"];

?

[pool release];

[nsstring release];

热点排行