相信大家对自动释放和手动释放疑惑很大,废话少说,先上代码:
//
// 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