NSOperation не полностью освобожден? Количество активных байтов не менее общего количества байтов в утилите распределения, несмотря на завершение операций - PullRequest
0 голосов
/ 28 апреля 2011

Я выполняю большое количество NSOperation задач, и мое приложение использует много памяти. Хотя он должен использовать совсем немного, он использует величины больше, чем должен, и я думаю, из Instruments, что это потому, что NSOperation объекты не полностью освобождены. Код для моего NSOperation подкласса таков:

- (id)initFromNode:(BKObject *)sender withNumber:(NSNumber *)number; {
  self = [super init];
  if (self) {
    _number = [number retain];
    _sender = [sender retain];
  }
  return self;
}
- (void)main {
  [_sender go:_number];
}
- (void)dealloc {
  [_number release];
  _number = nil;
  [_sender release];
  _sender = nil;
  [super dealloc];
}

Мои подозрения таковы, потому что в Instruments, когда я использую утилиту Allocations, она показывает огромные объемы данных для моего _NSOperationInternal, а также для моих подклассов NSOperation, но число живых байтов всегда равно общему Количество байтов Я также проверил утилиту Leaks, которая никогда не обнаруживает утечек памяти. Я осторожен при освобождении любых объектов операций после добавления их в очередь.

Я также застрял в блоке завершения, чтобы проверить, действительно ли он заканчивается, и я могу подтвердить, что, по крайней мере, некоторые из них это делают. Подтверждение того, что все они будут более трудоемкими, и данные в реальном времени в Инструментах должны немного снизиться, даже если бы только, скажем, 10% из них заканчивали.

Я в растерянности. Дайте мне знать, если какое-либо из моих пониманий того, что я делаю, отключено, или если было бы полезно больше кода. Знаете ли вы, что может происходить, что это использует больше памяти, чем следовало бы?

1 Ответ

0 голосов
/ 28 апреля 2011

Чтобы отладить это, попробуйте посмотреть, будет ли вызван -dealloc.Самый простой способ сделать это - использовать NSLog, правильный путь - точка останова.

Мои предположения:

  • Вы неправильно выпустите NSOperations.
  • или у вас есть циклы сохранения.
  • Некоторые объекты в в вашем NSOperation не освобождаются, попробуйте добавить пул авто-выпуска вокруг вашего основного метода.
...