我一直在我的應用程序崩潰。當檢查日誌和使用ATOS,它告訴我,正是我得到的崩潰,這是我告訴我的NSRunLoop運行:iOS:在NSThread中運行定時器導致EXC_BAD_ACCESS?
/**
* Create a new thread for the timer
*
* @version $Revision: 0.1
*/
- (void)createTimerThread {
NSThread *timerThread = [[NSThread alloc] initWithTarget:self selector:@selector(startTimerThread) object:nil];
[timerThread start];
[timerThread release];
}//end
/**
* Start the actual timer
*
* @version $Revision: 0.1
*/
- (void)startTimerThread {
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
// Start timer
self.countTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(updateCounter:) userInfo:nil repeats:YES];
[runLoop run];// <--- Crash happened here
[pool release];
}//end
/**
* Update the counter
*
* @version $Revision: 0.1
*/
- (void)updateCounter:(NSTimer *)theTimer {
// Does tons of timer stuff here
}//end
正如你所看到的,在碰撞發生在[runLoop run]
但我沒有想法爲什麼。它通常在我第二次調用createTimerThread方法時發生。
我在這裏做錯了什麼?我所要做的只是在後臺運行一個計時器,因此它不在主線程中,因爲我需要更新UILabel
。
我應該使用像Grand Central Dispatch(GCD)這樣的新東西嗎?
啓用NSZombies,然後你會發現原因。 EXC_BAD_ACCESS是關於一些被釋放的東西,這不應該是a.k.a殭屍。 –
你是否從後臺線程訪問你的UILabel?或者其他任何UI元素? – JustSid
我更新updateCounter方法中的UILable。所以,不知道現在是否在後臺。 –