NSTimer плохой доступ - PullRequest
       15

NSTimer плохой доступ

1 голос
/ 17 февраля 2011

Я пытаюсь создать NSTimer, затем сделать его недействительным и освободить, а затем установить новый таймер. Тем не менее, я получаю EXC_BAD_ACCESS при попытке снова установить элемент таймера var.

Код ниже:

1) Я установил элемент таймера var (он настроен на сохранение)

self.mPageTimer = [NSTimer scheduledTimerWithTimeInterval:kPageTimerInterval target:self selector:@selector(pageTimerCallback) userInfo:nil repeats:NO];

2) Я отпустил

    [mPageTimer invalidate];
    [mPageTimer release];

Это приводит к сбою, когда я снова пытаюсь вызвать фрагмент на шаге 1, но я не уверен, почему. Я сохранил его, установив его, а затем отпустил, поэтому не следует ли об объекте позаботиться, и мой член var ok должен установить новый выделенный таймер?

Если я это сделаю, он не вылетает и работает нормально:

    [mPageTimer invalidate];
    [mPageTimer release];
    mPageTimer = nil;

Я не вижу, как я делаю что-то не так с освобождением объекта, потому что, независимо от того, если бы это было так, я не смогу всегда устанавливать свой член var на любой новый созданный nstimer, leak или нет?

1 Ответ

2 голосов
/ 17 февраля 2011

Можно ли предположить, что ...

  1. фрагмент 2) является не из установщика @property, но из другого метода в то время как вы
  2. просто @synthesize mPageTimer и
  3. объявление для таймера @property (nonatomic, retain) NSTimer* mPageTimer?
    (не важно атомное или атомное значение не имеет)

В этом случае , ожидается ваш сбой:

create timer (timer retains you, timer is autoreleased!)
schedule timer (runloop retains the timer)
assignment through setter (you retain the timer)
... (time passes)
has it fired?
Yes:
    since your timer is non-recurring, the runloop has marked it
    as invalid and released it after invocation of "pageTimerCallback:"
calling "invalidate":
    has it fired?
    No:
        runloop unschedules and releases
    Yes:
        noop or release (read: "I don't know and admittedly don't care")
calling "release" (you are no longer the owner)
... (time passes)
assignment through synthesized setter:
    [newTimer retain];
    [oldTimer release]; // Crash due to overrelease!

Короче говоря:
Если у вас естьсвойство для таймера, предоставьте свой собственный установщик и сделайте так, чтобы каждый доступ использовал его .
(допускаются два исключения: 1. реализация установщика 2. в dealloc, где вы release таймер *)

(* Не аннулируйте таймер, на который вы нацелены в dealloc: Это абсолютно Бессмысленно !)

...