//================================================================================================
// memman-no-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-no-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-no-pool memman-no-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-no-pool
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
{
}
-(void) hello;
@end
@implementation ClassA
-(void) hello
{
NSLog(@"hellon");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void func()
{
NSLog(@"{ beginn");
NSLog(@"alloc obj1");
ClassA *obj1 = [[ClassA alloc] init];
NSLog(@"obj1's retain count is %dn", [obj1 retainCount]);
NSLog(@"assign obj1 to obj2n");
ClassA *obj2 = obj1;
NSLog(@"obj2's retain count is %d before retainn", [obj2 retainCount]);
NSLog(@"obj2 retainn");
[obj2 retain];
NSLog(@"obj2's retain count is %d after retainn", [obj2 retainCount]);
NSLog(@"obj1 says hellon");
[obj1 hello];
NSLog(@"releasing obj1n");
NSLog(@"obj1's retain count is %d before releasen", [obj1 retainCount]);
[obj1 release];
NSLog(@"obj1's retain count is %d after releasen", [obj1 retainCount]);
NSLog(@"obj2 says hellon");
[obj2 hello];
NSLog(@"releasing obj2n");
NSLog(@"obj2's retain count is %d before releasen", [obj2 retainCount]);
[obj2 release];
NSLog(@"} endn");
}
int main(int argc, char**argv)
{
func();
return 0;
}
//================================================================================================
// memman-with-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-with-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-with-pool memman-with-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-with-pool
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
{
}
-(void) hello;
@end
@implementation ClassA
-(void) hello
{
NSLog(@"hellon");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void func()
{
NSLog(@"{ beginn");
NSLog(@"alloc obj1 and autorelease");
ClassA *obj1 = [[[ClassA alloc] init] autorelease];
NSLog(@"obj1's retain count is %dn", [obj1 retainCount]);
NSLog(@"assign obj1 to obj2n");
ClassA *obj2 = obj1;
NSLog(@"obj2's retain count is %d before retainn", [obj2 retainCount]);
NSLog(@"obj2 retainn");
[obj2 retain];
NSLog(@"obj2's retain count is %d after retainn", [obj2 retainCount]);
NSLog(@"obj1 says hellon");
[obj1 hello];
//NSLog(@"releasing obj1n");
//NSLog(@"obj1's retain count is %d before releasen", [obj1 retainCount]);
//[obj1 release]; // Do not release it
NSLog(@"obj1's retain count is %d after releasen", [obj1 retainCount]);
NSLog(@"obj2 says hellon");
[obj2 hello];
NSLog(@"releasing obj2n");
NSLog(@"obj2's retain count is %d before releasen", [obj2 retainCount]);
[obj2 release];
NSLog(@"obj2's retain count is %d after releasen", [obj2 retainCount]);
NSLog(@"Note: we don't release obj1n");
NSLog(@"} endn");
}
int main(int argc, char**argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
func();
NSLog(@"releasing autoreleasePooln");
[pool release];
NSLog(@"autoreleasePool is releasedn");
return 0;
}
//================================================================================================
// memman-many-objs-one-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-many-objs-one-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-many-objs-one-pool memman-many-objs-one-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-many-objs-one-pool
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
{
}
-(void) hello;
@end
@implementation ClassA
-(void) hello
{
NSLog(@"hellon");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void func()
{
NSLog(@"Many objects but one pooln");
int i, j;
for (i = 0; i < 100; i++ )
{
for (j = 0; j < 100000; j++ )
[NSString stringWithFormat:@"1234567890"];
}
}
int main(int argc, char**argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
func();
NSLog(@"releasing autoreleasePooln");
[pool release];
NSLog(@"autoreleasePool is releasedn");
return 0;
}
//================================================================================================
// memman-many-objs-many-pools.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-many-objs-many-pools.m -I /GNUstep/System/Library/Headers
//gcc -o memman-many-objs-many-pools memman-many-objs-many-pools.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-many-objs-many-pools
#import <Foundation/Foundation.h>
@interface ClassA : NSObject
{
}
-(void) hello;
@end
@implementation ClassA
-(void) hello
{
NSLog(@"hellon");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void func()
{
NSLog(@"Many objects and many poolsn");
int i, j;
for (i = 0; i < 100; i++ )
{
NSAutoreleasePool *loopPool = [[NSAutoreleasePool alloc] init];
for (j = 0; j < 100000; j++ )
[NSString stringWithFormat:@"1234567890"];
[loopPool release];
}
}
int main(int argc, char**argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
func();
NSLog(@"releasing autoreleasePooln");
[pool release];
NSLog(@"autoreleasePool is releasedn");
return 0;
}
//================================================================================================
// memman-property.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-property.m -I /GNUstep/System/Library/Headers
//gcc -o memman-property memman-property.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-property
#import <Foundation/Foundation.h>
@interface ClassB : NSObject
{
int index;
}
@property int index;
-(void) hello;
@end
@implementation ClassB
@synthesize index;
-(void) hello
{
NSLog(@"hello ClassBn");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassB %d destroyedn", index);
}
@end
@interface ClassA : NSObject
{
ClassB* objB;
}
@property (retain) ClassB* objB;
-(void) hello;
@end
@implementation ClassA
@synthesize objB;
-(void) hello
{
NSLog(@"hello ClassAn");
}
-(void) dealloc
{
NSLog(@"releasing internal member objBn");
[objB release];
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void funcNoAutorelease()
{
NSLog(@"---------No autorelase---------n");
ClassB *objB1 = [[ClassB alloc]init];
objB1.index = 1;
ClassA *objA = [[ClassA alloc]init];
NSLog(@"setting objB1n");
objA.objB = objB1;
[objB1 release];
ClassB *objB2 = [[ClassB alloc]init];
objB2.index = 2;
NSLog(@"setting objB2n");
objA.objB = objB2;
[objB2 release];
[objA release];
}
void funcAutorelease()
{
NSLog(@"---------autorelase---------n");
ClassB *objB1 = [[[ClassB alloc]init] autorelease];
objB1.index = 1;
ClassA *objA = [[[ClassA alloc]init] autorelease];
NSLog(@"setting objB1n");
objA.objB = objB1;
ClassB *objB2 = [[[ClassB alloc]init] autorelease];
objB2.index = 2;
NSLog(@"setting objB2n");
objA.objB = objB2;
}
int main (int argc, const char * argv[]) {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
funcNoAutorelease();
funcAutorelease();
NSLog(@"releasing autoreleasePooln");
[pool release];
NSLog(@"autoreleasePool is releasedn");
return 0;
}
//================================================================================================
// memman-getter-setter.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-getter-setter.m -I /GNUstep/System/Library/Headers
//gcc -o memman-getter-setter memman-getter-setter.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-getter-setter
#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 ClassBn");
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassB %d destroyedn", 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)
{
[objB release];
objB = [value retain];
NSLog(@"objB's retain count is %dn", [objB retainCount]);
}
}
-(void) hello
{
NSLog(@"hello ClassAn");
}
-(void) dealloc
{
NSLog(@"releasing internal member objBn");
[objB release];
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void funcNoAutorelease()
{
NSLog(@"---------No autorelease---------n");
ClassB *objB1 = [[ClassB alloc]init];
[objB1 setIndex:1];
ClassA *objA = [[ClassA alloc]init];
NSLog(@"setting objB1n");
[objA setObjB:objB1];
[objB1 release];
ClassB *objB2 = [[ClassB alloc]init];
[objB2 setIndex:2];
NSLog(@"setting objB2n");
[objA setObjB:objB2];
[objB2 release];
[objA release];
}
void funcAutorelease()
{
NSLog(@"--------autorelease-----------n");
ClassB *objB1 = [[[ClassB alloc]init] autorelease];
[objB1 setIndex:1];
ClassA *objA = [[[ClassA alloc]init] autorelease];
NSLog(@"setting objB1n");
[objA setObjB:objB1];
ClassB *objB2 = [[[ClassB alloc]init] autorelease];
[objB2 setIndex:2];
NSLog(@"setting objB2n");
[objA setObjB:objB2];
}
int main(int argc, char**argv)
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
funcNoAutorelease();
funcAutorelease();
NSLog(@"releasing autoreleasePooln");
[pool release];
NSLog(@"autoreleasePool is releasedn");
return 0;
}
//================================================================================================
// memman-run-loop-with-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-run-loop-with-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-run-loop-with-pool memman-run-loop-with-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-run-loop-with-pool
#import <Foundation/Foundation.h>
//-----------------------------------------------
// Class B
@interface ClassB : NSObject
{
}
@end
@implementation ClassB
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassB destroyedn");
}
@end
//-----------------------------------------------
// Class A
@interface ClassA : NSObject
{
}
-(ClassB*) createClassB;
@end
@implementation ClassA
-(ClassB*) createClassB
{
NSLog(@"create an instance of ClassB and autoreleasen");
return [[[ClassB alloc] init] autorelease];
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void func()
{
NSLog(@"{ beginn");
NSLog(@"create an instance of ClassA and autoreleasen");
ClassA *obj1 = [[[ClassA alloc] init] autorelease];
NSDate *now = [[NSDate alloc] init];
NSTimer *timer = [[NSTimer alloc] initWithFireDate:now
interval:0.0
target:obj1
selector:@selector(createClassB)
userInfo:nil
repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
[timer release];
[now release];
[runLoop run];
NSLog(@"} endn");
}
int main(int argc, char**argv)
{
NSLog(@"create an autoreleasePooln");
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
func();
NSLog(@"releasing autoreleasePooln");
[pool release];
NSLog(@"autoreleasePool is releasedn");
return 0;
}
//================================================================================================
// memman-run-loop-without-pool.m
//================================================================================================
//gcc -fconstant-string-class=NSConstantString -c memman-run-loop-without-pool.m -I /GNUstep/System/Library/Headers
//gcc -o memman-run-loop-without-pool memman-run-loop-without-pool.o -L /GNUstep/System/Library/Libraries/ -lobjc -lgnustep-base
//./memman-run-loop-without-pool
#import <Foundation/Foundation.h>
//-----------------------------------------------
// Class B
@interface ClassB : NSObject
{
}
@end
@implementation ClassB
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassB destroyedn");
}
@end
//-----------------------------------------------
// Class A
@interface ClassA : NSObject
{
}
-(ClassB*) createClassB;
@end
@implementation ClassA
-(ClassB*) createClassB
{
NSLog(@"create an instance of ClassB and autoreleasen");
return [[[ClassB alloc] init] autorelease];
}
-(void) dealloc
{
[super dealloc];
NSLog(@"ClassA destroyedn");
}
@end
void func()
{
NSLog(@"{ beginn");
NSLog(@"create an instance of ClassAn");
ClassA *obj1 = [[ClassA alloc] init];
NSDate *now = [[NSDate alloc] init];
NSTimer *timer = [[NSTimer alloc] initWithFireDate:now
interval:0.0
target:obj1
selector:@selector(createClassB)
userInfo:nil
repeats:NO];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addTimer:timer forMode:NSDefaultRunLoopMode];
[timer release];
[now release];
[runLoop run];
NSLog(@"Manually release the instance of ClassAn");
[obj1 release];
NSLog(@"} endn");
}
int main(int argc, char**argv)
{
NSLog(@"No autoreleasePool createdn");
func();
return 0;
}
//===============================================================================================
(1)
《iPhone/Mac Objective-C内存管理教程和原理剖析(一)基本原理》
[转]http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680488.html
(2)
《iPhone/Mac Objective-C内存管理教程和原理剖析(二)口诀与范式》
[转]http://www.cnblogs.com/VinceYuan/archive/2010/03/08/1680492.html