我正在尝试在我的应用程序的后台运行一个计时器,我在我的应用程序中大量使用计时器,而我宁愿在后台运行它,但是我在尝试释放NSAoutreleasePool时遇到内存泄漏。我的Timer类是单例,所以如果我启动新的计时器,旧的计时器会释放它。
+ (void)timerThread{
timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil]; //Create a new thread
[timerThread start]; //start the thread
}
//the thread starts by sending this message
+ (void) startTimerThread
{
timerNSPool = [[NSAutoreleasePool alloc] init];
NSRunLoop* runLoop = [NSRunLoop currentRunLoop];
timer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(startTime:) userInfo:nil repeats:YES];
//timer = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(startTime:) userInfo:nil repeats:YES];
//[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];
[runLoop run];
[timerNSPool release];
}
+ (void)startTime:(NSTimer *)theTimer{
if(timeDuration > 1)
timeLabel.text = [NSString stringWithFormat:@"%d",--timeDuration];
else{
[self stopTimer];
[delegate timeIsUp];
}
}
+ (void) stopTimer{
if(timer != nil)
{
[timerThread release];
[timeLabel release];
[timer invalidate];
timer = nil;
}
}
我在使用应用程序autoreleasepool的主线程runLoop上运行NSTimer时遇到了问题。 我在[timerNSPool发布]漏洞了; GeneralBlock-16 Malloc WebCore WKSetCurrentGraphicsContext
导致泄漏的原因是从辅助线程更新UI:
timeLabel.text = [NSString stringWithFormat:@"%d",--timeDuration];
但是我添加了另一个方法updateTextLbl,然后我用这个
调用它[self performSelectorOnMainThread:@selector(updateTextLbl) withObject:nil waitUntilDone:YES];
在主线程上。我根本没有泄漏,但这会破坏第二个线程的目的。
这是我的第一篇文章,我感谢任何帮助,谢谢...提前......
答案 0 :(得分:2)
您正在+startTime:
更新您的用户界面,但该方法无法在主线程中运行。这可能是您所看到的WebCore警告的来源。
答案 1 :(得分:0)
关闭袖口,你在那里的NSRunLoop似乎有点不合适。来自文档:
通常,您的应用程序不需要创建或显式管理NSRunLoop对象。每个NSThread对象(包括应用程序的主线程)都会根据需要自动为其创建NSRunLoop对象。如果需要访问当前线程的运行循环,可以使用类方法currentRunLoop。
你有一个计时器,启动一个线程,获取当前的运行循环并尝试开始运行它。是否要将计时器与该运行循环相关联?
通过致电:
(void)addTimer:(NSTimer *)aTimer forMode:(NSString *)模式