关于大循环的Objective-C内存管理

时间:2010-01-29 20:56:53

标签: objective-c memory-management loops

我的程序中有一个非常大的循环,我使用了很多临时变量和实例变量。当我的循环继续运行时,程序会占用越来越多的内存,直到崩溃为止。在这种情况下,我可以就如何正确的内存管理获得一些建议吗?我的主要问题是,为什么下面的代码错了?

以下是导致泄漏的代码:

  

(void)processTrackValues:(NSMutableArray *)标签{
  NSImage * trackArt = [tags objectAtIndex:5];
  NSMutableArray * tempArtArray = [[NSMutableArray alloc] init];
  [tempArtArray addObject:trackArt];
  [tempArtArray发布];
  }

我也尝试过:

  

(void)processTrackValues:(NSMutableArray *)标签{
  NSImage * trackArt = [tags objectAtIndex:5];
  NSMutableArray * tempArtArray = [[NSMutableArray alloc] init];
  [tempArtArray addObject:trackArt];
  [trackArt release];
  [tempArtArray发布];
  }

2 个答案:

答案 0 :(得分:6)

亚当的回答是正确的。在伪代码中:

unsigned int iters = 0;
NSAutoreleasePool *p = nil;
while(1) {
  if (!p) p = [[NSAutoreleasePool alloc] init];
  ... do stuff here ...
  if ( iters == 1000) {
     iters = 0;
     [p drain];
     p = nil;
  }
}

重复使用临时物品通常是浪费时间并且充满了脆弱性。

坦率地说,你可能只需要在循环中每次迭代都进行一次自动释放池舞,然后忽略任何愚蠢的计数器等,直到你有证据证明存在开销,否则就会出现。

类似的东西:

NSAutoreleasePool *p = nil;
while(1) {
  p = [[NSAutoreleasePool alloc] init];
  ... do stuff here ...
  [p drain];
}

答案 1 :(得分:3)

您可以尝试重用临时对象或为这些对象设置自己的AutoReleasePool,并每1000次左右发布一次。