Управление памятью Objective-C относительно больших циклов - PullRequest
0 голосов
/ 29 января 2010

В моей программе действительно большой цикл, и я использую много временных переменных и переменных экземпляра. Поскольку мой цикл продолжает работать, программа использует все больше и больше памяти, пока не выйдет из строя. Могу ли я получить несколько советов о том, как правильно управлять памятью в этой ситуации? Мой главный вопрос: почему следующий код неправильный?

Вот код, который вызывает утечку:

(void) processTrackValues: (NSMutableArray *) теги {
NSImage * trackArt = [теги objectAtIndex: 5];
NSMutableArray * tempArtArray = [[NSMutableArray alloc] init];
[tempArtArray addObject: trackArt];
[релиз tempArtArray];
}

Я тоже пробовал:

(void) processTrackValues: (NSMutableArray *) теги {
NSImage * trackArt = [теги objectAtIndex: 5];
NSMutableArray * tempArtArray = [[NSMutableArray alloc] init];
[tempArtArray addObject: trackArt];
[релиз trackArt];
[выпуск tempArtArray];
}

Ответы [ 2 ]

6 голосов
/ 30 января 2010

Адам ответил правильно. В псевдокоде:

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];
}
3 голосов
/ 30 января 2010

Вы можете попытаться повторно использовать ваши временные объекты или настроить собственный AutoReleasePool для этих объектов и выпускать его каждые 1000 итераций или около того.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...