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

Che*_*tan -1 loops memory-management objective-c

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

以下是导致泄漏的代码:

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

我也尝试过:

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

bbu*_*bum 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

坦率地说,你可能只需要每循环一次就进行一次自动释放池跳舞,并忽略任何愚蠢的计数器等,直到你有证据证明存在开销.

就像是:

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