switch caseのメインループでの高速化みたいなもの
今回は、performSelector:による高速化とは真逆のベタ書きによる高速化についてです。
随分昔、iModeのアプリが10KBの頃、無駄に関数を呼び出すのも、
変数名の文字数を増やすのもメモリ容量が許さなかった頃、こんな方法をとっていました。
(変数名はツールで短縮にするのがはやりでした)
void mainLoop() {
int flg; // ObjCならBOOL isLoop;とかの方がふさわしいでしょうね。
do {
flg = 0;
switch (mode) {
case 0:
// 処理
flg = 1; // ループする
mode = 2; // 次の飛び先を指定しています。 goto ジャンプのような使い方です。
break;
case 1:
// 処理
break;
case 2: // 実は何かの処理をまとめたメソッドもどき
// 処理
break;
}
} while (flg); // flg==1の時はループするので、flg=1として飛び先をmodeに入れるとジャンプ!
という方法です。
modeとflgを使って、switch case内の条件分岐へジャンプするという仕組みです。
一時配列をスタックとして使って、modeの値を保存すれば、サブルーチン的な呼び出しもできます。
ただこの方法、メインループに全部詰め込む為、やたらと長くなります。読み難いです。
こういう方法もあったのだなぁ、というご紹介でした。