NSDate: timeIntervalSinceNow аварийно завершает работу - PullRequest
2 голосов
/ 25 января 2012

Я хочу отобразить на экране истекшее время после какого-либо события.У меня есть переменная-член

NSDate *_startTime;

Я выделяю ее (и запускаю таймер) примерно так:

_startTime = [NSDate date];
_timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(clock) userInfo:nil repeats:YES];

Моя функция часов вызывается нормально, но когда я пытаюсь найти истекшее времяЯ получаю сбой без реального способа определить, что происходит;Я просто получаю EXC_BAD_ACCESS.Ниже показано, как я пытаюсь получить истекшее время с _startDate, которое выдает исключение:

NSTimeInterval secondsElapsed = [_startTime timeIntervalSinceNow];

Это вылетает на этой строке - я оглянулся вокруг, и это, кажется, правильный синтаксис, что происходитздесь

Ответы [ 4 ]

2 голосов
/ 25 января 2012

Если вы не используете ARC, вам необходимо владеть NSDate объектом, который вы храните в _startTime. +[NSDate date] возвращает объект, который вам не принадлежит, и он, вероятно, был освобожден и, следовательно, станет недействительным к тому времени, как вы его отправите timeIntervalSinceNow.

Вы можете создать собственное NSDate примерно так:

// By default, NSDates are initialized with the current date
_startTime = [[NSDate alloc] init];

или явно завладев возвращаемым значением +date:

_startTime = [[NSDate date] retain];

Они эквивалентны в действии.

Еще лучше (при условии, что у вас есть свойство, определенное для _startTime (что вам следует)), было бы использовать установщик:

[self setStartTime:[NSDate date]];

Со свойством, определенным как retain ing, это будет правильно обрабатывать память.

2 голосов
/ 25 января 2012

Возможно, вам нужно retain ваш _startTime, в противном случае он будет автоматически выпущен.(Конечно, как только вы сохраните его, вы несете ответственность за его последующее освобождение.)

0 голосов
/ 25 января 2012

[NSDate date] вернет автоматически освобожденный объект. Он будет освобожден после выхода из области видимости. Если вы хотите использовать его в функции «часы», вам нужно сохранить его.

0 голосов
/ 25 января 2012

Вы не сохранили _startTime, поэтому он мог быть освобожден к моменту срабатывания таймера.

...