如果这样写:

#include"say.h"#include<Foundation/Foundation.h>intmain(void){idspeaker;NSString*name=@"GNUstep!";NSAutoreleasePool*pool;NSArray*outArray;NSArray*array2;array2=[NSMutableArrayarrayWithCapacity:20];pool=[NSAutoreleasePoolnew];speaker=[[Sayalloc]init];outArray=[NSArrayarrayWithObjects:@"Msg1",@"Msg2",@"Msg3",@"Msg4",nil];//printf("%@\n",[outArrayobjectAtIndex:0]);//GNUstep下只输出了@//GSPrintf(stdout,"%@",[outArrayobjectAtIndex:1]);//GNUstep下崩溃NSLog(@"%@\n",[outArrayobjectAtIndex:2]);//GNUStep下ok[speakersayHello];[speakersayHelloTo:name];RELEASE(speaker);RELEASE(pool);#ifdefDEBUGNSLog(@"%@\n",@"DebugNow");#endifreturn0;}

array2 就不受内存池管控,执行时会报错:

$ ./obj/HelloWorld.exe

2013-03-15 15:20:57.015 HelloWorld[5372] autorelease called without pool for ob

ect (0x3eb2f8) of class GSMutableArray in thread <NSThread: 0x520878>

把array2=[NSMutableArrayarrayWithCapacity:20];放置到 pool=[NSAutoreleasePoolnew]; 之后,就没有问题了。