web-dev-qa-db-ja.com

秒の2つの日付の差iOS

コンテンツがユーザーに表示されるアプリがあります。ここで、ユーザーが実際にそのコンテンツを表示する秒数を調べたいと思います。だから私のヘッダーファイルで、私は宣言しました

 NSDate *startTime;
 NSDate *endTime;

その後、私の意見で

 startTime = [NSDate date];

その後、私の意見ではWillDisappear

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

ただし、アプリがクラッシュし、異なるエラーが発生する場合があります。場合によってはメモリリーク、NSTimeIntervalの問題、そしてコンテンツに2度戻った後にクラッシュすることがあります。

これを修正するアイデアはありますか?

47
Adam Altinkaya

aRCを使用していないので、書くとき

startTime = [NSDate date];

startTimeは保持されないため、-viewWillDisappearが呼び出される前に割り当てが解除されます。試して

startTime = [[NSDate date] retain];

また、ARCを使用することをお勧めします。メモリ管理を使用すると、使用しない場合よりもエラーがはるかに少なくなります。

13
medvedNick

開始日を保持するプロパティを宣言する必要があります。時差を計算する前に、日付がリリースされます。

だから宣言

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

クリーンアップすることを忘れないでください。

- (void)dealloc
{
    [self.startDate release];
    [super dealloc];
}
12
Lukas