Создать счетчик времени с Objective-C - PullRequest
0 голосов
/ 11 декабря 2010

Я новичок в target-c и пытаюсь создать счетчик времени, но когда я запускаю метод start, метод обновления выполняется только один раз, а затем я получаю в консоли:

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

1 Ответ

2 голосов
/ 11 декабря 2010

Ваша проблема в том, что [NSDate date] возвращает автоматически выпущенную дату. Это хорошо для первого запуска вашего таймера, так как вы вызываете fire для таймера до конца метода, который был инициализирован recordDate.

Вам нужно retain recordDate, чтобы он прожил достаточно долго, чтобы пережить еще одну ссылку на него при последующих срабатываниях таймера.

Автоматически освобожденные объекты освобождаются платформой в конце каждой итерации цикла выполнения. Вы никогда не сможете точно знать, когда закончится цикл выполнения, поэтому вы можете быть в безопасности только в предположении, что автоматически выпущенные объекты безопасны для использования до конца метода, в котором они были автоматически освобождены.

добавление recordDate = [[NSDate date] retain]; к вашему коду должно решить вашу проблему.

Но не забывайте, что теперь, когда вы сохранили свой объект recordDate, вам нужно освободить его в какой-то момент в будущем - метод stop: может показаться хорошим местом для этого.

Наконец, после освобождения объекта recordDate вы должны назначить nil указателю, чтобы предотвратить любые проблемы с «висящим указателем».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...