Использование NSDate в цикле - PullRequest
4 голосов
/ 10 июня 2011

Я хочу получить текущую дату, используя [NSDate date] в цикле while.Я выполняю это, делая так:

while (interval > 0.0) {

    NSDate *currentDate = [[NSDate alloc] init];  
    currentDate =  [NSDate date];  
    interval = (float) [newDate timeIntervalSinceDate: currentDate] / 60;  
    [currentDate release];
}

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

Ответы [ 3 ]

6 голосов
/ 10 июня 2011

В строке NSDate *currentDate = [[NSDate alloc] init]; вы создаете новый объект, который вы должны освободить. В строке currentDate = [NSDate date]; вы не отпускаете старый объект, вы только делаете указатель, указывающий на другой объект. В строке [currentDate release]; вы освобождаете объект, созданный во второй строке цикла, что может привести к ошибке (этот объект помечен как авто-релиз 1, и iOS очистит его для вас). Вы должны переписать свой код как:

while (interval > 0.0) {
      NSDate *currentDate =  [NSDate date];
      interval = (float) [newDate timeIntervalSinceDate: currentDate] / 60;
}
4 голосов
/ 10 июня 2011

Вам не нужна первая строка NSDate *currentDate = [[NSDate alloc] init];. Вы можете напрямую назначить [NSDate date] на currentDate .

NSDate *currentDate =  nil;

while (interval > 0.0) {

    currentDate =  [NSDate date];
    interval = (float) [newDate timeIntervalSinceDate: currentDate] / 60;
}
3 голосов
/ 10 июня 2011

Проблема не в том, что вы сами производите утечку, а в том, что вы работаете в цикле while.

Даты автоматического выпуска растут в пуле автоматического выпуска, потому что пул очищается только во время простоя в цикле выполнения.

Одним из решений является создание локального пула автоматического выпуска в рамках времени

  while (foo) {
      NSAutoreleasePool *aPool = [[NSAutoreleasePool alloc ] init];
      NSDate *currentDate = [NSDate date];
      // other computational foo
      [aPool release]
  }

Когда вы освобождаете пул в локальной области, он немедленно удалит запрошенную вами дату автоматического выпуска.

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