timeIntervalSinceDate给出了exc_bad_access或autorelease错误

时间:2011-08-18 15:18:54

标签: objective-c ios memory-management nsdate exc-bad-access

所以我有一个对象代表iPhone屏幕上绘制的一条线。我还有一个球在屏幕上移动,当球和线相交时,绳子就有了生命。对于我目前的版本,我不断收到此错误,没有崩溃,但球停止在屏幕上移动:

2011-08-18 11:00:05.436 myProgram [192:5e03] * __NSAutoreleaseNoPool():类NSCFString的对象0x1531c0自动释放,没有池到位 - 只是泄漏

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 个答案:

答案 0 :(得分:1)

当你致电[self.startTime release]时,你的过度释放。这个版本是访问者(setStartTime:)的工作。

这段代码没有任何意义,并且因为它留下了悬垂的伊娃,所以很危险:

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

这应该是:

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

您收到autoreleasepool错误的事实表明您在后台线程上运行此操作。您的代码不是线程安全的,因此这将是一个问题。

编辑关于线程代码,您如何调用beginLifeTracking?那将是我怀疑你进入错误的线程的地方。我会非常关注这个autoreleasepool警告。

答案 1 :(得分:0)

这一行:

startTime = [NSDate dateWithTimeIntervalSince1970:0];

将使用自动释放的startDate覆盖实例变量NSDate。在该方法退出后不久,Menaing将被释放并成为一个悬空指针。

这是导致您崩溃的原因。

你的方法应该是这样的:

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

我还取消了您的日志声明并使其正常工作。