我的程序中有一个非常大的循环,我使用了很多临时变量和实例变量。当我的循环继续运行时,程序会占用越来越多的内存,直到崩溃为止。在这种情况下,我可以就如何正确的内存管理获得一些建议吗?我的主要问题是,为什么下面的代码错了?
以下是导致泄漏的代码:
(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发布];
}
答案 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次左右发布一次。