2011-01-31 11 views
5

Próbuję ustawić statyczną datę, aby określić, ile sekund upłynęło od czasu wywołania tej metody.Używanie statycznej wartości NSDate do określenia czasu przejścia

Natychmiastowa awaria!

 
-(void) myMethod 
{ 
    static NSDate *staticDate = nil; 
    NSTimeInterval seconds = 0.0; 

    if(staticDate) 
    { 
     NSLog(@"%@", staticDate); 
     seconds = [staticDate timeIntervalSinceNow]; 
    } 

    staticDate = [NSDate date]; 
    NSLog(@"%.2f", seconds); 
} 

Odpowiedz

0

Czy to się zawiesza w następującej linii?

NSLog(@"%.2f", seconds); 

Ponieważ NSTimeInterval jest typedef dla typu podwójne, a zastępczy określa pływak.

+0

Zgodnie z dokumentacją Specyfikacje formatu String% f określa podwójne. "% f - liczba zmiennoprzecinkowa 64-bitowa (podwójna)" – Jasarien

+0

Wystarczająco fair. Twoja odpowiedź powyżej wygląda dobrze. :) –

+0

To zawiesza się bez żadnego komunikatu o błędzie. Czym powinienem być mój symbol zastępczy? – Patricia

7

Być może lepiej będzie użyć timeIntervalSince1970, ponieważ jest to powszechnie stosowana metoda w wielu językach. Zwróci liczbę sekund, które upłynęły od 1 stycznia 1970.

Skonfiguruj zmienną instancji do przechowywania po raz pierwszyInterval i zainicjuj ją do wartości zwróconej przez [[NSDate date] timeIntervalSince1970], możesz użyć jej w swojej metodzie jak ta :

-(void) myMethod 
{ 
    NSTimeInterval seconds = [[NSDate date] timeIntervalSince1970] - _initialTimeInterval; 
    NSLog(@"Seconds = %.2f", seconds); 
} 

posible powód aktualna kod może upaść dlatego [NSDate date] zwraca autoreleased obiekt. Mimo że zmienna jest statyczna, pula autorelease prawdopodobnie zwalnia obiekt daty, a następnie powoduje awarię podczas próby uzyskania do niej dostępu przy następnym uruchomieniu metody.

Być może uda ci się ominąć tę awarię, jeśli utworzysz nową datę lub zatrzymasz tę zwróconą z date. Jednak przypisanie zatrzymanego/posiadanego obiektu do zmiennej statycznej spowoduje wyciek pamięci i sugeruję, abyś zamiast tego wypróbował moje rozwiązanie.

0

spróbować czegoś takiego:

-(void) myMethod 
{ 

    static NSDate *staticDate = nil; 
    if (staticDate == nil) staticDate = [[NSDate date] retain]; 

    if(staticDate) 
    { 
    NSTimeInterval elapsedTime = fabs([staticDate timeIntervalSinceNow]); 
    NSLog(@"elapsedTime == %.7f sec (%.4f ms)", 
        elapsedTime, elapsedTime * 1000.0); 
    } 
    [staticDate release]; 
    staticDate = [[NSDate date] retain]; 
} 
0

Nie jesteś zachowaniu datę utworzenia - naprawdę chcesz:

staticDate = [[NSDate date] retain]; 

Zmienna statyczna utrzymuje wskaźnik, a jeśli nie zachowują wskaźnik pamięć zostaje zwolniona i nic nie wskazujesz.

Powiązane problemy