2010-12-11 4 views
0

私は新しい目標である-cで、タイムカウンタを作成しようとしていますが、startメソッドを起動すると、更新メソッドは1回だけ実行されてからコンソールの場合:Objective-Cでタイムカウンタを作成する

2010-12-11 14:11:45.080 StatusBarApp[10037:a0f] Break down: 0min 0hours 0days 0moths 
Program received signal: “EXC_BAD_ACCESS”. 
sharedlibrary apply-load-rules all 

問題がどこにあるのか分かりません。

- (void)start:(id)sender { 
    recordDate = [NSDate date]; 
    _timer = [NSTimer scheduledTimerWithTimeInterval:(1.0) target:self     
    selector:@selector(updateTime:) userInfo:nil repeats:YES]; 
    [_timer fire]; 
} 


    - (void)stop:(id)sender { 
     [statusItem setTitle:@""]; 
     [_timer invalidate]; 
      [_timer release]; 
} 
    - (IBAction)updateTime:(id)sender { 
    // The time interval 

    // Get the system calendar 
    NSCalendar *sysCalendar = [NSCalendar currentCalendar]; 

    // Create the NSDates 
    NSDate* date1 = [[NSDate alloc] init]; 
    // Get conversion to months, days, hours, minutes 
    unsigned int flags = NSHourCalendarUnit | NSMinuteCalendarUnit | NSDayCalendarUnit | NSMonthCalendarUnit; 
    NSDateComponents* breakdownInfo = [sysCalendar components:flags fromDate:date1 toDate:recordDate options:0]; 
    NSLog(@"Break down: %dmin %dhours %ddays %dmoths",[breakdownInfo minute], [breakdownInfo hour], [breakdownInfo day], [breakdownInfo month]); 
    [date1 release]; 
    [statusItem setTitle:[NSString stringWithFormat:@" %dmin %dhours %ddays %dmoths",[breakdownInfo minute], [breakdownInfo hour], [breakdownInfo day], [breakdownInfo month]]]; 
    } 

答えて

2

あなたの問題は[NSDate date]は自動解放の日付を返すことです: はここに私のコードです。 recordDateが初期化されたメソッドの終了前にタイマーでfireと呼んでいるので、これはタイマーの最初の実行では問題ありません。

次のタイマーの起動時に別の参照を生き延びるのに十分な長さのためには、retainrecordDateが必要です。

自動実行オブジェクトは、実行ループの各繰り返しの最後にフレームワークによって解放されます。実行ループがいつ終了するかを確実に知ることはできません。自動解放されたオブジェクトは、オートレリースされたメソッドの最後まで安全に使用できるという前提で安全です。

recordDate = [[NSDate date] retain];をコードに追加する必要があります。あなたの問題を解決してください。

しかし、あなたのrecordDateオブジェクトが保持されていることを忘れないでください。将来はいつでも解放する必要があります。stop:メソッドはこれを行うのに適しています。

最後に、recordDateオブジェクトをリリースした後に、nilをポインタに割り当てて、「ぶら下がりポインタ」の問題を防ぐ必要があります。

+0

これは機能します。 :) どうもありがとうございました! – aphex

関連する問題