ipad/iphone内存管理三之NoAutorelease和Autorelease详细解说

相信大家对自动释放和手动释放疑惑很大,废话少说,先上代码:

//
//  main.m
//  MemoryManagement
//
//  Created by b126 on 12-4-23.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//


#import <Foundation/Foundation.h>  

//-----------------------------------------------
// Class B
@interface ClassB : NSObject
{
	int index;
}

-(int) getIndex;
-(void) setIndex:(int) value;

-(void) hello;
@end

@implementation ClassB

-(int) getIndex
{
	return index;
}

-(void) setIndex:(int) value
{
	index = value;
}

-(void) hello
{
	NSLog(@"hello ClassB\n");
}

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassB%d destroyed\n", index);
}
@end

//-----------------------------------------------
// Class A
@interface ClassA : NSObject
{
	ClassB *objB;
}

-(ClassB *) getObjB;
-(void) setObjB:(ClassB *) value;

-(void) hello;
@end

@implementation ClassA

-(ClassB*) getObjB
{
	return objB;
}

-(void) setObjB:(ClassB*) value
{
	if (objB != value)
	{
        NSLog(@"objB%d's before release count is %lx\n", [objB getIndex],(unsigned long)[objB retainCount]);
		[objB release];
		objB = [value retain];
		NSLog(@"objB%d's retain count is %lx\n", [objB getIndex],(unsigned long)[objB retainCount]);
	}
}


-(void) hello
{
	NSLog(@"hello ClassA\n");
}

-(void) dealloc
{
	NSLog(@"releasing internal member objB%d\n",[objB getIndex]);
	[objB release];
	[super dealloc];
	NSLog(@"ClassA destroyed\n");
}
@end

void funcNoAutorelease()
{
	NSLog(@"---------No autorelease---------\n");
	
	ClassB *objB1 = [[ClassB alloc]init];
	[objB1 setIndex:1];
    NSLog(@"objB1's setIndex count is %lx\n", (unsigned long)[objB1 retainCount]);
    
	ClassA *objA = [[ClassA alloc]init];
	NSLog(@"setting objB1\n");
	[objA setObjB:objB1];
	[objB1 release];
    NSLog(@"objB1's release count is %lx\n", (unsigned long)[objB1 retainCount]);
    NSLog(@"objA's  count is %lx\n", (unsigned long)[objA retainCount]);
    
	ClassB *objB2 = [[ClassB alloc]init];
	[objB2 setIndex:2];
    NSLog(@"objB2's setIndex count is %lx\n", (unsigned long)[objB2 retainCount]);
    
	NSLog(@"setting objB2\n");
	[objA setObjB:objB2];
     NSLog(@"objB2's retain count is %lx\n", (unsigned long)[objB2 retainCount]);
	[objB2 release];
    
    NSLog(@"objA's before release count is %lx\n", (unsigned long)[objA retainCount]);
	[objA release];
    
}

void funcAutorelease()
{
	NSLog(@"--------autorelease-----------\n");
	
	ClassB *objB1 = [[[ClassB alloc]init] autorelease];
	[objB1 setIndex:1];
     NSLog(@"objB1's retain count is %lx\n", (unsigned long)[objB1 retainCount]);
    
    
	ClassA *objA = [[[ClassA alloc]init] autorelease];
	NSLog(@"setting objB1\n");
	[objA setObjB:objB1];
    NSLog(@"objA's count is %lx\n", (unsigned long)[objA retainCount]);
    
	ClassB *objB2 = [[[ClassB alloc]init] autorelease];
	[objB2 setIndex:2];
    NSLog(@"objB2's retain count is %lx\n", (unsigned long)[objB2 retainCount]);
    
	NSLog(@"setting objB2\n");
	[objA setObjB:objB2];
}

int main(int argc, char**argv)  
{    
	NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];    
    
	funcNoAutorelease();
	funcAutorelease();
	
	NSLog(@"releasing autoreleasePool\n"); 
	[pool release]; 
	NSLog(@"autoreleasePool is released\n"); 
	
	return 0;
}  

输出的结果是:

2012-04-26 16:03:09.420 MemoryManagement[1094:403] ---------No autorelease---------
2012-04-26 16:03:09.423 MemoryManagement[1094:403] objB1's setIndex count is 1
2012-04-26 16:03:09.424 MemoryManagement[1094:403] setting objB1
2012-04-26 16:03:09.425 MemoryManagement[1094:403] objB0's before release count is 0
2012-04-26 16:03:09.426 MemoryManagement[1094:403] objB1's retain count is 2
2012-04-26 16:03:09.426 MemoryManagement[1094:403] objB1's release count is 1
2012-04-26 16:03:09.427 MemoryManagement[1094:403] objA's  count is 1
2012-04-26 16:03:09.428 MemoryManagement[1094:403] objB2's setIndex count is 1
2012-04-26 16:03:09.429 MemoryManagement[1094:403] setting objB2
2012-04-26 16:03:09.429 MemoryManagement[1094:403] objB1's before release count is 1
2012-04-26 16:03:09.430 MemoryManagement[1094:403] ClassB1 destroyed
2012-04-26 16:03:09.431 MemoryManagement[1094:403] objB2's retain count is 2
2012-04-26 16:03:09.432 MemoryManagement[1094:403] objB2's retain count is 2
2012-04-26 16:03:09.433 MemoryManagement[1094:403] objA's before release count is 1
2012-04-26 16:03:09.434 MemoryManagement[1094:403] releasing internal member objB2
2012-04-26 16:03:09.434 MemoryManagement[1094:403] ClassB2 destroyed
2012-04-26 16:03:09.435 MemoryManagement[1094:403] ClassA destroyed
2012-04-26 16:03:09.436 MemoryManagement[1094:403] --------autorelease-----------
2012-04-26 16:03:09.437 MemoryManagement[1094:403] objB1's retain count is 1
2012-04-26 16:03:09.438 MemoryManagement[1094:403] setting objB1
2012-04-26 16:03:09.439 MemoryManagement[1094:403] objB0's before release count is 0
2012-04-26 16:03:09.440 MemoryManagement[1094:403] objB1's retain count is 2
2012-04-26 16:03:09.441 MemoryManagement[1094:403] objA's count is 1
2012-04-26 16:03:09.441 MemoryManagement[1094:403] objB2's retain count is 1
2012-04-26 16:03:09.442 MemoryManagement[1094:403] setting objB2
2012-04-26 16:03:09.443 MemoryManagement[1094:403] objB1's before release count is 2
2012-04-26 16:03:09.444 MemoryManagement[1094:403] objB2's retain count is 2
2012-04-26 16:03:09.445 MemoryManagement[1094:403] releasing autoreleasePool
2012-04-26 16:03:09.445 MemoryManagement[1094:403] releasing internal member objB2
2012-04-26 16:03:09.446 MemoryManagement[1094:403] ClassB2 destroyed
2012-04-26 16:03:09.447 MemoryManagement[1094:403] ClassA destroyed
2012-04-26 16:03:09.448 MemoryManagement[1094:403] ClassB1 destroyed
2012-04-26 16:03:09.467 MemoryManagement[1094:403] autoreleasePool is released
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值