2010-12-11 67 views
0

我是新的int目標-C和我試圖創建一個時間計數器,但是當我啓動啓動方法,更新方法只有一次執行,然後我得到在控制檯中:創建時間計數器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 2010-12-11 15:01:58