2010-11-21 3 views
2

CPU負荷の点では、このiPhone - スレッド

[self performSelectorOnMainThread:@selector(doStuff:) 
         withObject:myObject 
        waitUntilDone:YES]; 

の代わりに、単に

[self doStuff:myObject]; 

を使用しての違いは何ですか?それとも他の利点がありますか?

ありがとうございました。

答えて

2
[self performSelectorOnMainThread:@selector(doStuff:) 
        withObject:myObject 
       waitUntilDone:YES]; 

これは、セレクタがメインスレッドでメインスレッドで実行されるようにします。 waitUntilDone:YESを設定すると、メイン実行ループがセレクタを実行する必要がある限り、現在のスレッドはアイドル状態になります。 シングルスレッド環境では、マルチスレッド環境でこれを呼び出した直後にrunloopが実行され、メインrunloopは次のステップを実行するとセレクタを実行します。

[self doStuff:myObject];は、あなたの例では第2のメッセージをセレクタすぐ

+0

ありがとうございます!私は親切にそれを疑っていた! – SpaceDog

+0

すみませんが、それほど正確ではありませんでした。それをメインスレッドから呼び出すと、メソッドは 'waitUntilDone:YES'パラメータのためすぐに実行されます。このメッセージは実行ループをスキップし、実行ループはこの条件では実行されないことに注意することが重要です。なぜなら、メイン実行ループは、自動解放プールを排水し、キューに入れられたメッセージを実行するなど、メモリ管理や実行順序に影響する可能性があるためです。コード。 – tia

+0

ねえ、情報に感謝します。それを知らなかった! – JustSid

1

最初のメソッドは、メソッドがメインスレッドで呼び出されることを保証します。マルチスレッドをしていない場合、同じ結果が得られるはずです。

1

を行いながら、あなたは関数を呼び出した後、セレクタのような小さなオーバーヘッドが右に行われていないの両方のいずれかの場合ではなく、後の時点で持っていますすぐに送信されますが、最初のスレッドはメインスレッドの実行ループに追加され、すぐには実行されません。

関連する問題