2011-02-06 4 views
0

Этот код работает хорошоВопрос о NSTimer и сохранить

@property (nonatomic, retain) NSTimer *timer; 
self.timer = [[NSTimer timerWithTimeInterval:kAdsAppearTimeInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:NO] retain]; 

этот код получить CFRelease. Но почему? я использую сохранить свойству

self.timer = [NSTimer timerWithTimeInterval:kAdsAppearTimeInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:NO]; 
+1

Что вы подразумеваете под «этим кодом получить CFRelease»? – kubi

+0

мое приложение разбилось - и я получаю CFRelease – Voloda2

+0

Но «CFRelease» не является ошибкой. –

ответ

10

не много идти дальше ... но:

@property (nonatomic, retain) NSTimer *timer; 
self.timer = [[NSTimer timerWithTimeInterval:kAdsAppearTimeInterval target:self selector:@selector(timerFired:) userInfo:nil repeats:NO] retain]; 

Это будет в конечном итоге сохранить Таймера 3 раза и один раз сам.

  1. Таймер + 1 для -retain
  2. Таймер + 1 для планирования его
  3. Таймер + 1 для задания свойств

  4. self +1 за то, что цель таймера

Таймер будет выпущен один раз при запуске (поскольку он будет незапланирован из цикла запуска). self будет выпущен, когда таймер будет признан недействительным или выпущен (вам не придется заботиться).

Итак, у вас есть два счета для учета. Вызов retain в коде выше - шум; не беспокойтесь, поскольку присвоение свойства сохранит его.

Это оставляет имущество сохранено. Самый очевидный способ - выпустить таймер в -dealloc.

Однако, если вам не требуется потенциально аннулировать таймер перед его запуском, нет причин иметь переменную экземпляра, относящуюся к таймеру вообще. Даже если у вас есть iVar, нет причин удерживать таймер либо , сколько вы установили self.timer = nil в свой timerFired: метод (и установите его на ноль, если вы недействительны в любом месте).

+0

Вы не имеете в виду - * запланировано * TimerWithTimeInterval: ...? – jrc

+0

Возможно. Надеюсь, ОП выяснил, что им нужно запланировать эту вещь. :) – bbum

0

Для не повторяющегося таймера, если вам нужна ссылка на переменную экземпляра, я бы не рекомендовал сохранить свойство в своем объявлении, чтобы избежать путаницы.

установки переменной экземпляра (MyTimer)

myTimer = [NSTimer scheduledTimerWithTimeInterval:myTimerInterval 
              target:self 
              selector:@selector(myTimerFired:) 
              userInfo:nil 
              repeats:NO]; 

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

- (void) myTimerFired: (NSTimer *) theTimer{ 

      myTimer = nil; 
     //etc 
    } 

Таким образом, если вам должны ссылаться на вашу переменную экземпляра (например, чтобы отключить таймер при выходе из контроллера вида)

-(void) onBack { 
      if(myTimer){ 
       [myTimer invalidate]; 
       myTimer = nil; 
       } 
    } 
Смежные вопросы