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

来源:互联网 发布:暖气片造价知乎 编辑:程序博客网 时间:2024/05/26 09:55

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

////  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");}@endvoid 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 12012-04-26 16:03:09.424 MemoryManagement[1094:403] setting objB12012-04-26 16:03:09.425 MemoryManagement[1094:403] objB0's before release count is 02012-04-26 16:03:09.426 MemoryManagement[1094:403] objB1's retain count is 22012-04-26 16:03:09.426 MemoryManagement[1094:403] objB1's release count is 12012-04-26 16:03:09.427 MemoryManagement[1094:403] objA's  count is 12012-04-26 16:03:09.428 MemoryManagement[1094:403] objB2's setIndex count is 12012-04-26 16:03:09.429 MemoryManagement[1094:403] setting objB22012-04-26 16:03:09.429 MemoryManagement[1094:403] objB1's before release count is 12012-04-26 16:03:09.430 MemoryManagement[1094:403] ClassB1 destroyed2012-04-26 16:03:09.431 MemoryManagement[1094:403] objB2's retain count is 22012-04-26 16:03:09.432 MemoryManagement[1094:403] objB2's retain count is 22012-04-26 16:03:09.433 MemoryManagement[1094:403] objA's before release count is 12012-04-26 16:03:09.434 MemoryManagement[1094:403] releasing internal member objB22012-04-26 16:03:09.434 MemoryManagement[1094:403] ClassB2 destroyed2012-04-26 16:03:09.435 MemoryManagement[1094:403] ClassA destroyed2012-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 12012-04-26 16:03:09.438 MemoryManagement[1094:403] setting objB12012-04-26 16:03:09.439 MemoryManagement[1094:403] objB0's before release count is 02012-04-26 16:03:09.440 MemoryManagement[1094:403] objB1's retain count is 22012-04-26 16:03:09.441 MemoryManagement[1094:403] objA's count is 12012-04-26 16:03:09.441 MemoryManagement[1094:403] objB2's retain count is 12012-04-26 16:03:09.442 MemoryManagement[1094:403] setting objB22012-04-26 16:03:09.443 MemoryManagement[1094:403] objB1's before release count is 22012-04-26 16:03:09.444 MemoryManagement[1094:403] objB2's retain count is 22012-04-26 16:03:09.445 MemoryManagement[1094:403] releasing autoreleasePool2012-04-26 16:03:09.445 MemoryManagement[1094:403] releasing internal member objB22012-04-26 16:03:09.446 MemoryManagement[1094:403] ClassB2 destroyed2012-04-26 16:03:09.447 MemoryManagement[1094:403] ClassA destroyed2012-04-26 16:03:09.448 MemoryManagement[1094:403] ClassB1 destroyed2012-04-26 16:03:09.467 MemoryManagement[1094:403] autoreleasePool is released
原创粉丝点击