2012-03-27 2 views
1

Я работаю над приложением iOS (FW: 5.0+ & ARC), который необходимо обновлять второй раз.NSRunLoop работает нормально на Simulator, Crashes iDevice

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

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

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

Благодаря

+0

Что такое трассировка стека при сбое? Кроме того, вы упоминаете, что вы вызываете «FireOnload» с помощью 'performSelector' - вы вызываете основной поток или фон? – FluffulousChimp

+2

Ну, это не решит проблему, но если вы сразу же поместите таймер на runloop, вы также можете использовать schedTimerWithTimeInterval: и не ставьте его на runloop вручную. –

ответ

0

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

изменилось:

@property (weak, nonatomic) NSTimer *counter;

к:

@property (strong, nonatomic) NSTimer *counter;

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

0

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

Смежные вопросы