2013-11-01 25 views
46

Ho un'app in cui il contenuto è visualizzato all'utente. Ora voglio scoprire quanti secondi un utente visualizza effettivamente per quel contenuto. Così nel mio file di intestazione, ho dichiarato unDifferenza tra 2 date in secondi ios

NSDate *startTime; 
NSDate *endTime; 

Poi nel mio viewWillAppear

startTime = [NSDate date]; 

Poi nel mio viewWillDisappear

endTime = [NSDate date]; 
NSTimeInterval secs = [endTime timeIntervalSinceDate:startTime]; 
NSLog(@"Seconds --------> %f", secs); 

Tuttavia, l'applicazione si blocca, con diversi errori a volte . A volte si tratta di una perdita di memoria, a volte è un problema con NSTimeInterval e talvolta si arresta in modo anomalo dopo essere tornato al contenuto per la seconda volta.

Qualche idea per risolvere il problema?

+1

Pubblica il registro degli arresti anomali. – Jano

+0

Ho modificato il codice come sopra ... Il log che a volte ottengo è: - [__ NSCFType timeIntervalSinceReferenceDate]: selettore non riconosciuto inviato all'istanza 0xbbf7c10 ' –

+0

stai usando ARC? – medvedNick

risposta

13

dal momento che non si utilizza ARC, quando si scrive

startTime = [NSDate date];

non venga conservata startTime, quindi è deallocato prima -viewWillDisappear si chiama. Prova

startTime = [[NSDate date] retain];

Inoltre, vi consiglio di usare ARC. Ci dovrebbe essere molto meno errori con la gestione della memoria con esso, che senza di esso

11

Si dovrebbe dichiarare una proprietà con conservare per la data di inizio. La tua data verrà rilasciata prima di poter calcolare la differenza di orario.

Così dichiarano

@property (nonatomic, retain) NSDate *startDate 

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [self setStartDate: [NSDate date]]; 
} 

- (void)viewWillDisappear:(BOOL)animated 
{ 
    [super viewWillDisappear:animated]; 
    NSLog(@"Seconds --------> %f",[[NSDate date] timeIntervalSinceDate: self.startDate]); 
} 

Non dimenticare di pulizia.

- (void)dealloc 
{ 
    [self.startDate release]; 
    [super dealloc]; 
} 
Problemi correlati