iPhone/Mac Objective-C内存管理教程和原理剖析

来源:互联网 发布:为知笔记导入印象笔记 编辑:程序博客网 时间:2024/06/06 10:45

//================================================================================================// 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");}@endvoid 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");}@endvoid 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 itNSLog(@"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");}@endvoid 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");}@endvoid 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");}@endvoid 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");}@endvoid 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");}@endvoid 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:nowinterval:0.0target:obj1selector:@selector(createClassB)userInfo:nilrepeats: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");}@endvoid func(){NSLog(@"{ beginn");NSLog(@"create an instance of ClassAn");ClassA *obj1 = [[ClassA alloc] init];NSDate *now = [[NSDate alloc] init];NSTimer *timer = [[NSTimer alloc] initWithFireDate:nowinterval:0.0target:obj1selector:@selector(createClassB)userInfo:nilrepeats: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