Вопрос по поводу NSTimer и сохранить - PullRequest
0 голосов
/ 06 февраля 2011

Этот код хорошо работает

@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];

Ответы [ 2 ]

10 голосов
/ 06 февраля 2011

Не много, чтобы продолжить ... но:

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

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

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

  4. self +1 дляцель таймера

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

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

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

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

0 голосов
/ 04 февраля 2013

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

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

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

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

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

            myTimer = nil;
        //etc
    }

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

 -(void) onBack {
             if(myTimer){
                 [myTimer invalidate];
                 myTimer = nil;
              }
    }
...