ios自动释放池(autoreleasepool)

#import <Foundation/Foundation.h>

@interface Test : NSObject
@end

@implementation Test
@end


int main (int argc, const char * argv[]) {
	
	NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
	Test *test = [[Test alloc]init];
	
	NSLog(@"对象初始化以后的引用计数为:%x",[test retainCount]);
	
	[pool drain];
	NSLog(@"释放自动释放池以后,对象的引用计数为:%x",[test retainCount]);
	
	pool = [[NSAutoreleasePool alloc]init];
	[test autorelease];
	NSLog(@"将对象添加到自动释放池以后的引用计数为:%x",[test retainCount]);
	
	[test retain];
	NSLog(@"对象进行retain后的引用计数为:%x",[test retainCount]);
	
	[pool drain];
	NSLog(@"释放自动释放池以后,对象的引用计数为:%x",[test retainCount]);
	
	[test release];
	return 0;
}

通过使用autorelease,该对象就被放入自动释放池,系统自动跟踪每个对象的使用情况,并在释放自动释放池时,释放池中所有对象。

上面这一段代码是书上的,但很好说明了autoreleasepool的用法,以前老师们常说不能死读书的,应是多思考,自己动手写实例,多提问,多讨论吧

这里我把的思考写出来,供大家参考:

1.autoreleasepool只能放也池中的对象起作用,我们手工管理内存它不管,也就是说手工或自动(系统)两套不同的机制;

2.加入用[test autorelease],释放用pool drain

3.autoreleasepool不是系统的垃圾收集功能(Garbage Colliction)


4.aotoreleasepool到达底什么时候释放?是pool drain后就释放了吗?

对于每一个Runloop, 系统会隐式创建一个Autorelease pool(自然会有多个Autorelease pool),这样所有的release pool会构成一个象CallStack一样的一个栈式结构,在每一个Runloop结束时,当前栈顶的Autorelease pool会被销毁,这样这个pool里的每个Object会被release。
那什么是一个Runloop呢? 一个UI事件,Timer call, delegate call, 都会是一个新的Runloop。(暂没有在官方文档中找到这个解释)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值