2010-03-19 2 views
2

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

- (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 секунд)

+0

что делает 'stopAnimationTimer' делать? Я думаю, вам нужно сделать недействительным таймер (и я надеюсь, что вы делаете это в своем методе stopAnimationTimer). – bddckr

+0

yep, он просто отменяет таймер и устанавливает свойство в nil. – dontWatchMyProfile

ответ

3

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

+0

Вы имеете в виду 'release''и вместо' dealloc''ing, не так ли? – bddckr

+0

... К сожалению! Да! :) –

5

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

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

+1

+1 Должно быть правильным, если 'invalidate'' 'освобождает таймер. Потому что он использует 'self.animationTimer = timer;' это сначала выпустит старое, а затем сохранит новое значение, и поэтому это должно быть безопасным для утечки. – bddckr

1

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

Смежные вопросы