0

NSTimerObjective-C に問題があります。これは私のソース コードです: Main.m

#import <Foundation/Foundation.h>
#import "TimerTest.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        TimerTest *timerTest = [[[TimerTest alloc] init] autorelease];
    }
    return 0;
}

TimerTest.h

#import <Foundation/Foundation.h>

@interface TimerTest : NSObject {
    NSTimer *_timer;
}
@property (nonatomic, retain) NSTimer *timer;
- (id) init;
@end

TimerTest.m

#import "TimerTest.h"

@implementation TimerTest
@synthesize timer = _timer;
- (id) init {
    if (self = [super init]) {
        [NSTimer timerWithTimeInterval:0.5f 
                                target:self 
                              selector:@selector(tick:) 
                              userInfo:nil 
                               repeats:YES];
    }
    return self;
}

- (void) tick: (NSDate *) dt {
    NSLog(@"Tick!  \n");
}

- (void) dealloc {
    self.timer = nil;    
    [super dealloc];
}
@end

私のプログラムは、0.5 秒ごとに "Tick! \n" をログに記録する必要があります。しかし、その後、私のプログラムは終了し、xcode コンソールは明確になりました。これはNSLog-(void)tick:(NSDate *)dtメソッドが機能しなかったことを意味します。私の間違いはどこですか?

4

2 に答える 2

1

私のプログラムは、0.5秒ごとに「Tick!\n」をログに記録する必要があります。

いいえ、すべきではありません(少なくとも、投稿したコードによれば)。実行ループが必要です。タイマーは、実行ループのイベントとしてのみ起動します。したがって、メインでは、1つを設定して実行する必要があります。

于 2012-04-04T12:58:46.690 に答える
0

イベントループが必要なだけでなく、タイマーを作成しましたが、上記の実行ループでスケジュールしていません。それ以外の:

    [NSTimer timerWithTimeInterval:0.5f 
                            target:self 
                          selector:@selector(tick:) 
                          userInfo:nil 
                           repeats:YES];

これを行う:

    [NSTimer scheduledTimerWithTimeInterval:0.5f 
                                     target:self 
                                   selector:@selector(tick:) 
                                   userInfo:nil 
                                    repeats:YES];

デリゲートの applicationDidFinishLaunching で TimerTest の割り当てを実行して、Cocoa アプリケーションのコンテキストでコードをセットアップし (実行ループが付属しているため)、それ以外の場合はコードが機能します。

他のいくつかのこと: セレクターが ScheduledTimerWithTimerInterval:... に渡されるメソッドは、

- (void)timerMethod:(NSTimer *)aTimer

タイマーを使い終わったら、無効にします。

[timer invalidate];

これを行うにはタイマーへの参照を保持する必要がありますが、そうではないようです。

于 2012-04-04T13:23:06.450 に答える