NSAutoreleasePool初始化语句必须是第一条执行语句
更新:HHH   时间:2023-1-7


 

如果这样写:

  1. #include "say.h" 
  2. #include <Foundation/Foundation.h> 
  3.  
  4. int main(void)  
  5.         id speaker; 
  6.         NSString *name = @"GNUstep !"
  7.         NSAutoreleasePool *pool; 
  8.         NSArray           *outArray; 
  9.         NSArray                     *array2; 
  10.          
  11.         array2 = [NSMutableArray arrayWithCapacity:20]; 
  12.          
  13.         pool = [NSAutoreleasePool new]; 
  14.         speaker = [[Say alloc] init]; 
  15.         outArray = [NSArray arrayWithObjects: @"Msg1", @"Msg2", @"Msg3", @"Msg4", nil]; 
  16.         //printf("%@\n", [outArray objectAtIndex: 0]);      //GNUstep下只输出了@ 
  17.         //GSPrintf(stdout, "%@", [outArray objectAtIndex: 1]);  // GNUstep下崩溃 
  18.         NSLog(@"%@\n", [outArray objectAtIndex: 2]);                        // GNUStep下ok 
  19.          
  20.         [speaker sayHello]; 
  21.         [speaker sayHelloTo: name]; 
  22.          
  23.         RELEASE(speaker); 
  24.         RELEASE(pool); 
  25.          
  26.         #ifdef DEBUG 
  27.             NSLog(@"%@\n", @"Debug Now"); 
  28.         #endif 
  29.          
  30.         return 0; 

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 = [NSMutableArray arrayWithCapacity:20]; 放置到 pool = [NSAutoreleasePool new]; 之后,就没有问题了。

 

 

返回开发技术教程...