NSRunLoop работает нормально на симуляторе, вылетает iDevice - PullRequest
2 голосов
/ 27 марта 2012

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

В настоящее время у меня есть это в методе (который вызывается в executeSelector, когда -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 не падает.Однако он больше не обновляется каждую секунду.

Что я здесь не так делаю?

Спасибо

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Найдена проблема:

изменено:

@property (weak, nonatomic) NSTimer *counter;

на:

@property (strong, nonatomic) NSTimer *counter;

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

0 голосов
/ 27 марта 2012

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

...