2011-11-08 111 views
0

我想了解NSTimer,使用Foundation和打印到控制檯。有人可以告訴我我需要做些什麼才能使下面的工作?它編譯沒有錯誤,但沒有激活我的startTimer方法 - 沒有打印。如何獲得NSTimer循環

我的目標是讓一個方法調用另一個方法來運行某些語句,然後在設定的時間後停止。

#import <Foundation/Foundation.h> 

@interface MyTime : NSObject { 
    NSTimer *timer; 
} 
- (void)startTimer; 
@end 

@implementation MyTime 

- (void)dealloc { 
    [timer invalidate]; 
    [super dealloc]; 
} 

- (void)startTimer { 
    timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(runTimer:) userInfo:nil repeats:YES]; 
} 

- (void)runTimer:(NSTimer *)aTimer { 
    NSLog(@"timer fired"); 
} 
@end 


int main(int argc, char *argv[]) { 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 


    MyTime *timerTest = [[MyTime alloc] init]; 
    [timerTest startTimer]; 

    [timerTest release]; 

    [pool release]; 
    return 0; 
} 
+0

請獎勵過去曾幫助過您的人,並接受您的舊問題的答案。 – DarkDust

回答

-1

你必須初始化它後你的定時器添加到默認runloop:

[[NSRunLoop mainRunLoop] addTimer:timer forMode:NSDefaultRunLoopMode]; 

-(void)startTimer.

+0

我剛剛複製並粘貼到 - (void)startTimer但它仍然無法正常工作。如果放置在定時器語句之上,它不會像以前那樣執如果放在下面,我得到一個線程!錯誤的錯誤。什麼建議看起來不錯 - 你可以再試一次嗎?謝謝Tim。 – pete

+1

把它放在下面是正確的地方。問題在於,在你的程序中你啓動了定時器,然後立即釋放包含它的對象,並且它仍然在runloop中,所以當它被調用時,它所操作的對象(在這種情況下'testTimer')已經消失了,這就是爲什麼你會得到一個錯誤。 – Tim

+1

如果您不使用正在使用的scheduledTimer系列類,這只是正確的。 – logancautrell

6

計時器從來沒有得到一個機會,在你的程序中火將這個,因爲程序在創建定時器後立即結束。

有一個名爲Run Loop的構造,它負責處理輸入,包括來自定時器的輸入。爲每個線程創建一個運行循環,但在此情況下不會自動啓動。

您需要運行運行循環並保持運行,直到計時器有機會觸發。幸運的是,這很容易。插入:

[[NSRunLoop mainRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5.0]]; 

發送startTimerreleasetimerTest之間。如果您想要重複計時器,則需要繼續保持運行循環處於活動狀態。

請注意,您只需要在一個簡單的程序中這樣做;當您使用GUI創建應用程序時,運行循環將通過Cocoa應用程序設置過程啓動,並且在應用程序終止之前保持活動狀態。

+0

我不認爲說「當主函數結束時,運行循環也結束了」是不準確的。我的意思是,退出程序確實會終止runloop,但這不是問題。在這個特定的例子中,甚至沒有runloop開始。 – Chuck

+0

@Chuck:我實際上正試圖解決這個問題。我的印象是這個循環是由[NS?]線程自動啓動的,但我想這實際上是由AppKit完成的? –

+0

每個NSThread *都有一個runloop,但它在告知之前不會運行。在一個普通的Cocoa應用程序中,主循環由'NSApplicationMain()'運行。我認爲這就是它在文檔中提到的那個功能「運行應用程序」時所指的。 – Chuck