Есть ли утечка памяти в NSCFTimer? - PullRequest
2 голосов
/ 20 марта 2010

Я обнаружил утечку памяти с помощью инструментов. Я всегда получаю информацию о том, что ответственной библиотекой является Фонд. Когда я отслеживаю это в своем коде, я оказываюсь здесь, но с управлением памятью все в порядке:

- (void)setupTimer {
    // stop timer if still there
    [self stopAnimationTimer];

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:0.2 target:self selector:@selector(step:) userInfo:nil repeats:YES];

    self.animationTimer = timer; // retain property, -release in -dealloc method
}

свойство animationTimer сохраняет таймер. В -dealloc I-выпускать его.

Теперь это похоже на ошибку фреймворка? Я проверил с iPhone OS 3.0 и 3.1, у обеих есть та проблема каждый раз, когда я использую NSTimer как это. Есть идеи, в чем еще может быть проблема?

(мой интервал сканирования утечки памяти составлял 0,1 секунды. Но то же самое с 5 секундами)

Ответы [ 3 ]

5 голосов
/ 20 марта 2010

Не звоните -[NSTimer dealloc]. Когда-либо.

В этом случае -scheduledTimerWithTimeInterval:target:selector:userInfo:repeats: уравновешивается -invalidate. Вам не нужно вызывать -dealloc или -release для объекта таймера.

3 голосов
/ 20 марта 2010

Если ваш метод stopAnimationTimer не используется invalidate и не release (а затем не установлен nil) для вашего свойства animationTimer, вы теряете память.

1 голос
/ 20 марта 2010

Я нашел это: у меня была сильная ссылка на мой таймер.Цикл выполнения сохраняет его.Таким образом, RC было 2. Но поскольку таймер также имеет сильную ссылку на цель (которая в моем случае сохранила таймер), у меня возникла тупиковая ситуация.-dealloc никогда не вызывался, и поэтому мой таймер никогда не был освобожден.WTF.

...