2011-01-31 14 views
5

Estoy tratando de configurar una fecha estática para determinar cuántos segundos han pasado entre cada vez que llamo a este método.Uso de un NSDate estático para determinar el tiempo transcurrido

¡Fallo instantáneo!

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

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

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

Respuesta

0

¿Se cuelga en la siguiente línea?

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

Debido NSTimeInterval es un typedef para el tipo doble, y el marcador de posición especifica un flotador .

+0

De acuerdo con la documentación de Especificadores de formato de cadena,% f especifica un doble. "% f - Número de coma flotante de 64 bits (doble)" – Jasarien

+0

Bastante justo. Su respuesta anterior se ve bien. :) –

+0

Se bloquea sin ningún mensaje de error. ¿Qué DEBERÍA ser mi marcador de posición? – Patricia

7

Quizás sea mejor que use timeIntervalSince1970, ya que es un método comúnmente utilizado en muchos idiomas. Devolverá el número de segundos transcurridos desde el 1 de enero de 1970.

Configure una variable de instancia para mantener la primera vez Intervalo e iníciela en el valor devuelto por [[NSDate date] timeIntervalSince1970], luego puede usarlo en su método de esta manera :

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

una de las razones por las que su posible código actual puede bloquearse porque se [NSDate date] devuelve un objeto autoreleased. Aunque la variable es estática, es probable que el grupo de liberación automática libere el objeto de fecha y provoque un bloqueo cuando intente acceder a él la próxima vez que se ejecute el método.

Puede evitar este bloqueo si crea una nueva fecha o conserva la que se devuelve desde date. Sin embargo, asignar un objeto retenido/propiedad a una variable estática dará como resultado una pérdida de memoria y le sugiero que intente con mi solución.

0

intentar algo como esto:

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

No está reteniendo la fecha se crea - que realmente quiere:

staticDate = [[NSDate date] retain]; 

La variable estática mantiene un puntero y si no conserve el puntero la memoria se libera y no apunta a nada.

Cuestiones relacionadas