NSRunLoop работает нормально на симуляторе, вылетает iDevice

Я работаю над приложением для iOS (FW: 5.0+ и ARC), которое необходимо обновлять каждую секунду.

В настоящее время у меня есть это в методе (который вызывается в PerformSelector при -ViewDidLoad):

-(void)FireOnload {
counter = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(countDownTime) userInfo:nil repeats:YES];
[counter fire];
[[NSRunLoop mainRunLoop] addTimer:counter forMode: NSDefaultRunLoopMode]; // <-- Causing Problem
}

-(void)countDownTime
{
double timeNow = [[NSDate date] timeIntervalSince1970];
double timeLeft = timeEnding - timeNow;

if(timeLeft < 60) // Less then 60 seconds, do something.
{
   //Do Stuff
}

}

переменная counter вызывается в заголовке как NSTimer. Я явно вызываю [counter fire], поэтому он вызывается, как только представление загружается, а не через 1 секунду.

Это прекрасно работает в симуляторе iOS и срабатывает каждую секунду, но при переходе на iDevice происходит сбой.

Я закомментировал строку NSRunLoop, и iDevice не падает. Однако он больше не обновляется каждую секунду.

Что я здесь делаю неправильно?

Спасибо


person Moe    schedule 27.03.2012    source источник
comment
Что такое трассировка стека при сбое? Кроме того, вы упоминаете, что звоните FireOnload, используя performSelector - вы звоните в основной поток или фон?   -  person FluffulousChimp    schedule 27.03.2012
comment
Ну, это не решит реальную проблему, но если вы собираетесь сразу же поместить таймер в цикл выполнения, вы также можете использовать ScheduleTimerWithTimeInterval: и не помещать его в цикл выполнения вручную.   -  person Thomas Bartelmess    schedule 27.03.2012


Ответы (2)


Нашел проблему:

измененный:

@property (weak, nonatomic) NSTimer *counter;

to:

@property (strong, nonatomic) NSTimer *counter;

Если вы не используете ARC, вам нужно заменить strong на retain.

person Moe    schedule 27.03.2012

Вы говорите, что используете performSelector для вызова FireOnLoad. Почему? Если вы вызываете его в фоновом потоке, вам нужно знать, что NSRunLoop не является потокобезопасным, поэтому вы не должны обращаться к основному циклу выполнения, кроме как в основном потоке.

person JeremyP    schedule 27.03.2012