2

私はObjective-Cの使い方を学んでいNSTimerて、運が悪かったので、scheduledTimeIntervalを使ってみました。私が使用しているコードは次のようになります。

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

int main(int argc, const char * argv[])
{
@autoreleasepool {

    NSTimer *timerNumber1;

    NSInteger counter=0;

    while (counter<5){


        timerNumber1 = [NSTimer scheduledTimerWithTimeInterval:1 target:timerNumber1 selector: @selector(updateTimer:) userInfo:nil repeats:YES];

    NSLog(@"Hello, World!");
        counter++;
    }
}
return 0;
}

timerNumber1ヘッダーは次のようになります

#import <Foundation/Foundation.h>

@interface timerNumber1 : NSObject
-(void) updateTimer;

@end

実装は

#import "timerNumber1.h"

@implementation timerNumber1

-(void) updateTimer{
NSLog(@"Timer Updated!");

}
@end

メソッドが起動することはなく、タイマーが更新されることもありません。
私はここで何が間違っているのですか?

4

1 に答える 1

0

変数timerNumber1はまだ初期化されていないnilため(おそらく)、targetパラメーターは有効になりません。updateTimerメソッドはオブジェクトに対して呼び出されますnilが、Objective-Cではサイレントに失敗します。

最初にオブジェクトを作成する必要があります。その後、実行したとおりに続行できます。

補足:変数とまったく同じ名前のクラスがあるのは少し珍しいことです。少なくとも読みやすさのために、これは通常は良い考えではありません。また、を持っているので、繰り返すたびに1つのタイマーを作成する必要があるかどうかは100%わかりませんrepeats:YES。しかし、私はあなたがあなたのコードで何をしたいのかをあなたに判断させます。:-)

編集:何か他のものにも気づきました。セレクターが少しずれている可能性があります。:セレクターにはがupdateTimerありますが、パラメーターを取りません。その場合、そこにコロンがあるべきではないと思います。

したがって、次のようなものを試してください。

int main(int argc, const char * argv[])
{
    @autoreleasepool {

        NSTimer *timer;
        timerNumber1 *timerNumber1Object = [[timerNumber1 alloc] init];

        NSInteger counter=0;

        while (counter<5){
            timer = [NSTimer scheduledTimerWithTimeInterval:1 target:timerNumber1Object selector: @selector(updateTimer) userInfo:nil repeats:YES];

            NSLog(@"Hello, World!");
            counter++;
        }
    }
    return 0;
}
于 2012-12-02T16:21:37.087 に答える