-1

@selectorまたは(SEL)を使用してvoidを呼び出すタイマーを作成するクラスを作成しています。[mytimer timer…] のときにアプリがクラッシュします。「不明なセレクターが呼び出された」ため、呼び出されます。エラーは、私が与えているボイドが見つからないということですが、ボイドが正常に機能することはわかっています。私の質問は、myselector 部分を正しく記述する方法です。

+ (void) timer:(NSTimer*)timer interval:(int)interval selector:(SEL)myselector   
{
timer = [NSTimer scheduledTimerWithTimeInterval:interval
                                         target:self
                                       selector:myselector
                                       userInfo:nil
                                        repeats:YES];
}

これは実装されているメソッドです:

[mytimer timer:NameOfTimerTheWorks interval:0.1 selector:@selector(myVoid)];

... 

- (void)myVoid
{
Do stuff
}

また、このクラスはまったく役に立たないように見えることも理解していますが、含まれていないものもあります。私の問題はセレクターを中心に展開しています。

4

2 に答える 2

2

@selector() の使用に問題はありません。問題は Objective C クラスにありself、さまざまなスコープでの意味があります。

+問題は、クラスメソッドでタイマーを作成していてself、その時点で必要なインスタンスではなく、実際にはClassそれ自体であることです。クラスメソッドでそれを行うことはありませんが、必要な場合は、ターゲットへの参照を渡すだけで、期待どおりのメッセージを送信する必要があります。

実装を次のように変更して、ターゲットを渡し、タイマーを返すようにします

+ (NSTimer *)timerWithTarget:(id)target 
     interval:(int)interval 
     selector:(SEL)myselector   
{
  return [NSTimer scheduledTimerWithTimeInterval:interval
                                           target:target
                                         selector:myselector
                                         userInfo:nil
                                          repeats:YES];
}


NameOfTimerTheWorks = [mytimer timetWithTarget:self interval:0.1 selector:@selector(myVoid)];

- (void)myVoid
{
  //Do stuff
}

さらに、Objective C では、クラスに名前を付ける標準的な方法は大文字で、必要に応じてキャメル ケースを使用します。あなたのクラスはすべきMyTimerではなくmytimer、iVarは小文字nameOfTimerTheWorksです。

于 2012-08-07T22:55:42.130 に答える