所以我有一个对象代表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];
}
我认为这是某种内存管理错误,但我所有的补救措施都失败了。我真的很感激在这里解释我做错了什么。谢谢!
答案 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);
}
我还取消了您的日志声明并使其正常工作。