ipad/iphone内存管理二

本次主要讲解的是 :autorelease
//
//  main.m
//  MemoryManagement
//
//  Created by b126 on 12-4-23.
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.
//


#import <Foundation/Foundation.h>  

@interface ClassA : NSObject
{
}
-(void) hello;
@end

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

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyed\n");
}
@end

void func()
{
	NSLog(@"{ begin\n");
	NSLog(@"alloc obj1 and autorelease");
	ClassA *obj1 = [[[ClassA alloc] init] autorelease];
	NSLog(@"obj1's retain count is %lx\n", (unsigned long)[obj1 retainCount]);
	NSLog(@"assign obj1 to obj2\n");
	ClassA *obj2 = obj1;
	NSLog(@"obj2's retain count is %lx before retain\n", (unsigned long)[obj2 retainCount]);
	NSLog(@"obj2 retain\n");
	[obj2 retain];
	NSLog(@"obj2's retain count is %lx after retain\n", (unsigned long)[obj2 retainCount]);
	NSLog(@"obj1 says hello\n");
	[obj1 hello];
	   NSLog(@"releasing obj1\n");
	   NSLog(@"obj1's retain count is %lx before release\n", (unsigned long)[obj1 retainCount]);
	   //[obj1 release]; // Do not release it
	   NSLog(@"obj1's retain count is %lx after release\n", (unsigned long)[obj1 retainCount]);
	NSLog(@"obj2 says hello\n");
	[obj2 hello];
	NSLog(@"releasing obj2\n");
	NSLog(@"obj2's retain count is %lx before release\n", (unsigned long)[obj2 retainCount]);
	[obj2 release];
	NSLog(@"obj2's retain count is %lx after release\n", (unsigned long)[obj2 retainCount]);
	NSLog(@"Note: we don't release obj1\n");
	
	NSLog(@"} end\n");
}

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

输出的结果是:

2012-04-24 19:15:45.708 MemoryManagement[15327:403] { begin
2012-04-24 19:15:45.750 MemoryManagement[15327:403] alloc obj1 and autorelease
2012-04-24 19:15:45.752 MemoryManagement[15327:403] obj1's retain count is 1
2012-04-24 19:15:45.753 MemoryManagement[15327:403] assign obj1 to obj2
2012-04-24 19:15:45.754 MemoryManagement[15327:403] obj2's retain count is 1 before retain
2012-04-24 19:15:45.755 MemoryManagement[15327:403] obj2 retain
2012-04-24 19:15:45.755 MemoryManagement[15327:403] obj2's retain count is 2 after retain
2012-04-24 19:15:45.757 MemoryManagement[15327:403] obj1 says hello
2012-04-24 19:15:45.758 MemoryManagement[15327:403] hello
2012-04-24 19:15:45.759 MemoryManagement[15327:403] releasing obj1
2012-04-24 19:15:45.759 MemoryManagement[15327:403] obj1's retain count is 2 before release
2012-04-24 19:15:45.760 MemoryManagement[15327:403] obj1's retain count is 2 after release
2012-04-24 19:15:45.761 MemoryManagement[15327:403] obj2 says hello
2012-04-24 19:15:45.762 MemoryManagement[15327:403] hello
2012-04-24 19:15:45.762 MemoryManagement[15327:403] releasing obj2
2012-04-24 19:15:45.763 MemoryManagement[15327:403] obj2's retain count is 2 before release
2012-04-24 19:15:45.764 MemoryManagement[15327:403] obj2's retain count is 1 after release
2012-04-24 19:15:45.764 MemoryManagement[15327:403] Note: we don't release obj1
2012-04-24 19:15:45.765 MemoryManagement[15327:403] } end
2012-04-24 19:15:45.766 MemoryManagement[15327:403] releasing autoreleasePool
2012-04-24 19:15:45.767 MemoryManagement[15327:403] ClassA destroyed
2012-04-24 19:15:45.768 MemoryManagement[15327:403] autoreleasePool is released

当我的代码是:

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


#import <Foundation/Foundation.h>  

@interface ClassA : NSObject
{
}
-(void) hello;
@end

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

-(void) dealloc
{
	[super dealloc];
	NSLog(@"ClassA destroyed\n");
}
@end

void func()
{
	NSLog(@"{ begin\n");
	NSLog(@"alloc obj1 and autorelease");
	ClassA *obj1 = [[[ClassA alloc] init] autorelease];
	NSLog(@"obj1's retain count is %lx\n", (unsigned long)[obj1 retainCount]);
	NSLog(@"assign obj1 to obj2\n");
	ClassA *obj2 = obj1;
	NSLog(@"obj2's retain count is %lx before retain\n", (unsigned long)[obj2 retainCount]);
	NSLog(@"obj2 retain\n");
	[obj2 retain];
	NSLog(@"obj2's retain count is %lx after retain\n", (unsigned long)[obj2 retainCount]);
	NSLog(@"obj1 says hello\n");
	[obj1 hello];
	   //NSLog(@"releasing obj1\n");
	   //NSLog(@"obj1's retain count is %lx before release\n", (unsigned long)[obj1 retainCount]);
	   //[obj1 release]; // Do not release it
	   //NSLog(@"obj1's retain count is %lx after release\n", (unsigned long)[obj1 retainCount]);
	NSLog(@"obj2 says hello\n");
	[obj2 hello];
	NSLog(@"releasing obj2\n");
	NSLog(@"obj2's retain count is %lx before release\n", (unsigned long)[obj2 retainCount]);
	[obj2 release];
	NSLog(@"obj2's retain count is %lx after release\n", (unsigned long)[obj2 retainCount]);
	NSLog(@"Note: we don't release obj1\n");
	
	NSLog(@"} end\n");
}

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


输出为:

2012-04-24 19:17:30.762 MemoryManagement[15337:403] { begin
2012-04-24 19:17:30.765 MemoryManagement[15337:403] alloc obj1 and autorelease
2012-04-24 19:17:30.766 MemoryManagement[15337:403] obj1's retain count is 1
2012-04-24 19:17:30.766 MemoryManagement[15337:403] assign obj1 to obj2
2012-04-24 19:17:30.767 MemoryManagement[15337:403] obj2's retain count is 1 before retain
2012-04-24 19:17:30.768 MemoryManagement[15337:403] obj2 retain
2012-04-24 19:17:30.769 MemoryManagement[15337:403] obj2's retain count is 2 after retain
2012-04-24 19:17:30.769 MemoryManagement[15337:403] obj1 says hello
2012-04-24 19:17:30.770 MemoryManagement[15337:403] hello
2012-04-24 19:17:30.771 MemoryManagement[15337:403] obj2 says hello
2012-04-24 19:17:30.772 MemoryManagement[15337:403] hello
2012-04-24 19:17:30.777 MemoryManagement[15337:403] releasing obj2
2012-04-24 19:17:30.778 MemoryManagement[15337:403] obj2's retain count is 2 before release
2012-04-24 19:17:30.779 MemoryManagement[15337:403] obj2's retain count is 1 after release
2012-04-24 19:17:30.779 MemoryManagement[15337:403] Note: we don't release obj1
2012-04-24 19:17:30.780 MemoryManagement[15337:403] } end
2012-04-24 19:17:30.781 MemoryManagement[15337:403] releasing autoreleasePool
2012-04-24 19:17:30.782 MemoryManagement[15337:403] ClassA destroyed
2012-04-24 19:17:30.782 MemoryManagement[15337:403] autoreleasePool is released


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值