NSTimerは、一定時間ごとに処理を呼び出すことで、見た感じは、まるで「複数の処理が動いている」かのように見せることができます。例えばGUIアプリケーションなどで、常にアニメーションをしているような表示も、
NSTimerで非常に短い間隔で表示を更新させることで可能になります。が、これはあくまで「そう見える」だけで、実行している処理は常に1つだけです。
同時に複数の処理を並行して行わせたい。そういうときには、
NSTimerでは役に立ちません。このような場合には「
マルチスレッド」のための機能が必要です。
「
スレッド」というのは、プログラムの中で実行される処理の単位のようなものです。同時に複数のプログラムを動かすことを「
マルチタスク」と呼びますが、あれの「プログラム内バージョン」みたいなものです。プログラムを実行すると、まず「
メインスレッド」という基本となるスレッドが実行され、その中でプログラムの処理が進められていきます。これに、更に新しいスレッドを追加することにより、メインスレッドと新スレッドの2つのスレッドで、並行して処理が進められるようになる、というわけです。
この
スレッドに関する機能を提供するのが「
NSThread」というクラスです。これは、新しいスレッドを作成し、そこで指定の処理を実行させるためのものです。これは以下のようにしてインスタンスを作成します。
[NSThread detachNewThreadSelector:《SEL》 toTarget:ターゲット
withObject:引数];
《SEL》――スレッドで実行するメソッドを示すメッセージセレクタ
ターゲット――対象となるオブジェクト
引数――メッセージセレクタに受け渡す引数の値
このコンビニエンスコンストラクタは、新しいスレッドを作成し、そこでメッセージを送って処理を実行させます。引数は、送信するメッセージに関するもので、送信先となるターゲットのオブジェクト、メッセージセレクタ、引数の値といったものが用意されます。要するに、ここで呼び出したメソッドが新しいスレッドで実行される、ということですね。
新しいスレッドで実行されたメソッドは、終了すると自動的にそのスレッドも消滅します。「
detachNewThreadSelector:」というメソッド名は、「新しいスレッドのセレクタを
デタッチする」というようなニュアンスになりますね。
スレッドの方式には、「
アタッチ」と「
デタッチ」があります。アタッチは、スレッド終了後に親スレッド(そのスレッドが派生する元のスレッド)に合流しますが、デタッチは終了後、そのまま消滅します。
NSThreadによるスレッドは、だいたい上のメソッドを使って作成することが多く、一般にデタッチで実行されます。つまり、「やりっ放し」でOKなのです。
とりあえずは、この
detachNewThreadSelector: toTarget: withObject:という長ったらしいメソッドで新しいスレッドを使う方法さえわかれば、マルチスレッドの基本はOKでしょう。