2010-02-14 32 views
0

我剛開始使用的OBJ-C /可可使用線程和我遇到一些麻煩。我得到這個錯誤在控制檯:可可線程錯誤

2010-02-15 09:18:41.467 Timer[1007:4503] *** __NSAutoreleaseNoPool(): Object 0x10012adc0 of class __NSCFDate autoreleased with no pool in place - just leaking 2010-02-15 09:18:41.478 Timer[1007:4503] *** __NSAutoreleaseNoPool(): Object 0x1003362b0 of class NSCFTimer autoreleased with no pool in place - just leaking 這裏是代碼創建新的線程:

// Timer 
JHTimer *timer = [[JHTimer alloc] init]; 
[timer setMinTextLabel:minTextLabel]; 
[timer setSecTextLabel:secTextLabel]; 
[timer setHrTextLabel:hrTextLabel]; 
timerTimeInt = 30; 
[timer setTimerInterval:timerTimeInt]; 
[NSThread detachNewThreadSelector:@selector(start) toTarget:timer withObject:nil]; 

和創建自動釋放池的代碼(創建計時器啓動方法):

- (void)main { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
} 

- (void)start { 
    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDidUpdate:) userInfo:nil repeats:YES]; 
    NSLog(@"Test"); 
} 

,我可以」不知道這是錯的

+0

您是否正在發佈您的計時器參考? – Zinc

+0

也許你可以把'[self main];'作爲你的'start'方法的第一行。 – dreamlax

回答

3

你的JHTimermain被調用從哪裏?您需要在提供給detachNewThreadSelector:toTarget:withObject:的選擇器的方法中創建自動釋放池,如the documentation中所述。

對於非垃圾回收的應用程序,方法aSelector負責爲新分離的線程設置自動釋放池,並在該池退出前釋放該池。垃圾收集的應用程序不需要創建自動釋放池。

+0

謝謝,效果很好....但NSTimer沒有運行 – nanochrome

+0

@nanochrome:我認爲創建一個NSTimer,即使在另一個線程中,仍然會導致觸發事件發生在主線程中,因爲它被安排在*當前*運行循環。如果你已經啓動了另一個線程,使用'[NSThread sleepForTimeInterval:1]'來簡單地睡眠線程可能會更有優勢。 – dreamlax

+0

我不太明白.... – nanochrome