2011-02-01 7 views
6

これはなぜ動作しないのでしょうか?performSelector:withObject:afterDelayクラスメソッドが動作しない

[self performSelector:@selector(foo:) withObject:argObj afterDelay:5.0]; 

私はこれをクラスメソッドの中から呼び出していますが、同じクラス(したがって 'self')の別のクラスメソッドを呼び出しています。これは有効ですか?

fooにブレークポイントを配置しましたが、呼び出されませんでした。何が起きてる?

+4

動作しているはずです。 fooのメソッド定義を投稿して、あなたのメソッドを投稿できますか?あなたはメインスレッドですか? – seppo0010

答えて

7

perform:afterDelay:を呼び出すスレッドで実行ループが実行されていますか?そうでない場合、実行されません。

+0

これが問題でした。私はその要求について聞いたこともありませんでした。ありがとうございました。 –

+1

あなたのコードが自動解放プールに囲まれていれば、そのコードは終了します。 –

+0

あなたはその事を実行する方法を詳しく教えていただけますか?ダムのような感じ:( – harshitgupta

-1

多分私はあなたの質問を誤解していますが、最初に静的コンテキストでselfキーワードを使用していますか?なぜ単にselfをクラスの名前に変更しないのですか?

+8

コンテキストは静的ではないためです。 'self'はクラスでもよいし、クラスのサブクラス(またはそれらのサブクラスなど)であってもよい。インスタンスメソッドの 'self'が必ずしもクラスのインスタンスではないように、時にはサブクラスや別の子孫のインスタンスです。 –

+1

ああ、知っておいてよかった。私はこれまで、Objective-Cの 'self'がJavaの 'this'と似ていると仮定していましたが、これは静的コンテキストでは使用できません。説明をありがとう。 –

+4

Obj-Cでは、クラス自体がオブジェクトです。クラスメソッドは、文字通り、メタクラスのインスタンスメソッドです(メタクラスは基本的にクラスのクラスです)。クラスメソッドはインスタンスメソッドとまったく同じ方法と呼ばれますが、唯一の違いはメソッドがクラスではなくメタクラスでルックアップされる点です。これは 'self'がクラスメソッドでインスタンスメソッドとまったく同じように動作することを意味します。 –

-1
- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay 

The methodは受信者がclassのインスタンスである必要があります。アクションを実行するには具体的なオブジェクトが必要です。だから私はそれがクラスメソッドで動作するとは思わない。

+1

performSelectorはクラス+クラスメソッドで動作します(10.6で確認済み)。だからあなたの問題は他の場所にある。 – CRD

+1

クラスはメタクラスの単なるインスタンスです。それは正常に動作するはずです。 – bbum

関連する問題