2013-11-01 14 views
46

Ich habe eine App, wo Inhalt für den Benutzer angezeigt wird. Ich möchte jetzt herausfinden, wie viele Sekunden ein Benutzer diesen Inhalt tatsächlich anzeigt. Also in meinem Header-Datei, habe ich erklärt einUnterschied zwischen 2 Daten in Sekunden ios

NSDate *startTime; 
NSDate *endTime; 

Da ist in meinem viewWillAppear

startTime = [NSDate date]; 

Da ist in meinem viewWillDisappear

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

jedoch die App abstürzt, mit verschiedenen Fehlern manchmal . Manchmal ist es ein Speicherleck, manchmal ist es ein Problem mit dem NSTimeInterval, und manchmal stürzt es ab, nachdem ich zum zweiten Mal zum Inhalt zurückgekehrt bin.

Irgendwelche Ideen, um das zu beheben?

+1

Veröffentlichen Sie das Absturzprotokoll. – Jano

+0

Ich habe den Code wie oben bearbeitet ... Das Protokoll, das ich manchmal bekomme, ist: - [__ NSCFType timeIntervalSinceReferenceDate]: unerkannter Selektor gesendet an Instanz 0xbbf7c10 ' –

+0

verwenden Sie ARC? – medvedNick

Antwort

13

da Sie nicht ARC verwenden, wenn Sie

startTime = [NSDate date];

schreiben Sie nicht behalten startTime, so dass es freigegeben wird, bevor -viewWillDisappear genannt wird. Versuchen

startTime = [[NSDate date] retain];

Auch ich empfehlen ARC zu verwenden. Es sollte viel weniger Fehler bei der Speicherverwaltung damit geben, als ohne es

11

Sie sollten eine Eigenschaft mit behalten für das Startdatum angeben. Ihr Datum wird freigegeben, bevor Sie den Zeitunterschied berechnen können.

So erklären

@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]); 
} 

nicht zur Reinigung Vergessen Sie.

- (void)dealloc 
{ 
    [self.startDate release]; 
    [super dealloc]; 
} 
Verwandte Themen