2012-03-27 5 views
1

Ich arbeite an einer iOS App (FW: 5.0+ & ARC), die Sekunde für Sekunde aktualisiert werden muss.NSRunLoop funktioniert OK auf Simulator, Crashes iDevice

Derzeit habe ich dies in einem Verfahren (das in einem perform wenn -ViewDidLoad genannt wird):

-(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 
} 

} 

die counter Variable aufgerufen wird im Header als NSTimer. Ich rufe explizit [counter fire] so dass es aufgerufen wird, sobald die Ansicht geladen ist, nicht nach 1 Sekunde.

Dies funktioniert gut im iOS-Simulator und wird jede Sekunde ausgelöst, aber wenn es zum iDevice geht, stürzt es ab.

Ich habe die NSRunLoop Zeile auskommentiert, und das iDevice stürzt nicht ab. Es wird jedoch nicht mehr jede Sekunde aktualisiert.

Was mache ich hier falsch?

Dank

+0

Was ist der Stack-Trace beim Absturz? Sie nennen auch 'FireOnload' mit' performSelector' - rufen Sie den Haupt-Thread oder Hintergrund an? – FluffulousChimp

+2

Nun, das wird das eigentliche Problem nicht beheben, aber wenn Sie den Timer sofort auf den Runloop setzen wollen, können Sie auch planedTimerWithTimeInterval: verwenden und ihn nicht manuell auf den Runloop setzen. –

Antwort

0

das Problem gefunden:

geändert:

@property (weak, nonatomic) NSTimer *counter;

zu:

@property (strong, nonatomic) NSTimer *counter;

Wenn Sie nicht ARC verwenden, müssen Sie dann strong ersetzen mit retain

0

Sie sagen, Sie performSelector verwenden FireOnLoad aufzurufen. Warum? Wenn Sie es in einem Hintergrundthread aufrufen, müssen Sie wissen, dass NSRunLoop nicht threadsicher ist. Daher sollten Sie nicht auf den Haupt-Runloop zugreifen, außer auf den Hauptthread.

Verwandte Themen