Вопрос о 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];

person Voloda2    schedule 06.02.2011    source источник
comment
Что вы подразумеваете под этим кодом получения CFRelease?   -  person kubi    schedule 06.02.2011
comment
мое приложение разбилось - и я получаю CFRRelease   -  person Voloda2    schedule 06.02.2011
comment
Но CFRRease не является ошибкой.   -  person Tom Harrington    schedule 07.02.2011


Ответы (2)


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

@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: (и устанавливаете его на nil, если вы где-то аннулируете).

person bbum    schedule 06.02.2011
comment
Вы имеете в виду -запланированныйTimerWithTimeInterval:…? - person jrc; 29.10.2012
comment
Наверное. Надеюсь, ОП понял, что им нужно запланировать это. :) - person bbum; 29.10.2012

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

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

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

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

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

            myTimer = nil;
        //etc
    }

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

 -(void) onBack {
             if(myTimer){
                 [myTimer invalidate];
                 myTimer = nil;
              }
    }
person rmigneco    schedule 04.02.2013