timeIntervalSinceDate выдает ошибки exc_bad_access или autorelease - PullRequest
0 голосов
/ 18 августа 2011

Итак, у меня есть объект, который представляет линию, нарисованную на экране iPhone. У меня также есть шар, движущийся по экрану, и когда мяч и линия пересекаются, струне дается жизнь. Для моей текущей сборки я получаю эту ошибку постоянно, без сбоев, но мяч перестает двигаться на экране:

2011-08-18 11: 00: 05.436 myProgram [192: 5e03] * __NSAutoreleaseNoPool (): объект 0x1531c0 класса NSCFString автоматически освобожден без пула - только утечка

Line.h: @interface Line: NSObject {

//time properties
NSTimeInterval life;
NSDate *startTime;
NSDate *currentTime;
}



//time properties
@property (nonatomic, retain) NSDate *startTime;


-(void) updateLife;

-(void) beginLifeTracking;

@end

Line.m

@synthesize startTime;

-(void)beginLifeTracking {
[self.startTime release]; //not sure if self is necessary here but startTime is released
                          //in case the same string is hit again
self.startTime = [NSDate date];
startTime = [NSDate dateWithTimeIntervalSince1970:0];
//NSLog(@"Time Interval: %f",startTime);
}


-(void) updateLife {
currentTime = [[NSDate date] retain];
NSLog(@"breakpoint1");   
life = [currentTime timeIntervalSinceDate:self.startTime];
[currentTime release];
}  

Я предполагаю, что это какая-то ошибка управления памятью, но все мои попытки исправить ее потерпели неудачу. Я бы очень признателен за объяснение того, что я делаю здесь неправильно. Спасибо!

Ответы [ 2 ]

1 голос
/ 18 августа 2011

Когда вы звоните [self.startTime release], вы переизбираете.Это средство доступа (setStartTime:), чтобы сделать этот выпуск.

Код не имеет никакого смысла и опасен, так как оставляет висячий ивар:

currentTime = [[NSDate date] retain];
NSLog(@"breakpoint1");   
life = [currentTime timeIntervalSinceDate:self.startTime];
[currentTime release];

Это должно быть:

self.life = [[NSDate date] timeIntervalSinceDate:self.startTime];

Тот факт, что вы получаете ошибку автозапуска, предполагает, что вы запускаете это в фоновом потоке.Ваш код не является поточно-ориентированным, поэтому это может быть проблемой.

EDIT Что касается кода с многопоточностью, как вы звоните beginLifeTracking?Я бы заподозрил, что вы попали не в ту нить.Я был бы очень обеспокоен этим предупреждением об автозапуске.

0 голосов
/ 18 августа 2011

Эта строка:

startTime = [NSDate dateWithTimeIntervalSince1970:0];

Перезапишет переменную экземпляра startDate с автоматически выпущенным NSDate.Менинг экземпляра будет выпущен и станет висящим указателем вскоре после выхода из метода.

Это то, что вызывает ваш сбой.

Ваш метод должен выглядеть примерно так:

-(void)beginLifeTracking {
    self.startTime = [NSDate dateWithTimeIntervalSince1970:0];
    NSLog(@"Time Interval: %@", self.startTime);
}

Я также раскомментировал вашу запись в журнале и заставил ее работать.

...