0

簡単なタイムアップを示すラベルを更新する次の方法があります

-(void)updateTimeLabel:(NSTimer *)timer{
    NSInteger secondsSinceStart = (NSInteger)[[NSDate date] timeIntervalSinceDate:_startTime];

    NSInteger seconds = secondsSinceStart % 60;
    NSInteger minutes = (secondsSinceStart / 60) % 60;
    NSInteger hours = secondsSinceStart / (60 * 60);
    NSString *result = nil;
    if (hours > 0) {
        result = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
    }
    else {
    result = [NSString stringWithFormat:@"%02d:%02d", minutes, seconds];
    }

    _totalTime = result;
    _totalTimeLabel.text = result;
}

次に、これをボタンへのアクションとして呼び出します。

-(IBAction) startTimer{
    _startTime = [NSDate date];
    _walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES];
    [_walkRouteTimer fire];
}

しかし、アプリを実行すると、不正なアクセスエラーが発生し、アプリがクラッシュします。誰か助けてもらえますか?

前もって感謝します

4

2 に答える 2

5

ARCを使用していますか?そうでない場合、_startTime = [NSDate date];この行は問題を引き起こします。[NSDate date]自動解放オブジェクトを返しました。ARCを使用していない場合(またはARCを使用しているが、_startTimeが弱いと宣言されている場合)、_startTimeはそれを保持しません。

もしそうなら、それに保持を追加してみてください

-(IBAction) startTimer{
    //_startTime = [NSDate date]
    _startTime = [[NSDate date] retain];
    _walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES];
    [_walkRouteTimer fire];
}

そして、タイマーが終了したら、を呼び出した後[_walkRouteTimer invalidate]、を呼び出します[_startTime release]

startTimeまたは、プロパティを使用して保持として宣言した場合は、さらに簡単になります。ドット表記を使用するだけです。

-(IBAction) startTimer{
    //_startTime = [NSDate date]
    self.startTime = [NSDate date];
    _walkRouteTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(updateTimeLabel:) userInfo:nil repeats:YES];
    [_walkRouteTimer fire];
}
...
//After [_walkRouteTimer invalidate]
self.startTime = nil;
于 2013-03-04T22:59:39.673 に答える
0

例外ブレークポイントを追加して、クラッシュしている行を確認してみてください。

1) ブレークポイント タブ (右から 2 番目) をクリックします...右向きの矢印または「次へ」ボタンのように見えます

2) タブメニューの左下隅にある「+」をクリックします

3) [例外ブレークポイントの追加] を選択します。

4) (オプション) [Exception] ドロップダウンを選択し、[Objective-C] に変更します。

5) 「完了」を選択

6) コードを再度実行し、クラッシュを生成しようとします...実行すると、うまくいけばこのブレークポイントによってキャッチされ、クラッシュしている行を確認して修正できるようになります

幸運を

于 2013-03-04T22:49:15.683 に答える