2

少なくとも私にとっては、マウス処理イベントで Apple が使用するルーチンの奇妙な動作に遭遇しました。ドキュメントでは、変数を宣言せずに静的な方法で使用しています。これは少し前のことですが、GLKit を使用する場合-lib、それらは一種の同じ動作を示します。たとえば、次のようなものです。

GLKVector3 GLKVector3Set(float x, float y, float z)
{
    GLKVector3 v = { x, y, z };
    return v;
}

通常の状況では、関数内で宣言されたすべての変数はスタックに置かれ、関数が呼び出しを返すと消えます...

マウス入力の状況は、次のようなものでした。

(void) mouseInput:(mouseEvent *)event
{
   BOOL hasClicked = NO;
   //
    if(hasClicked)
    {
        //
    } else {
      hasClicked = YES;
    }
}

BOOLが静的に宣言されている場合にのみ意味があります...

私が話していることを知っていて、この動作を説明できる人、または自分のサイトで Apple の説明を参照できる人がいれば、私はうれしいです。

ニールス

4

1 に答える 1

3

最初のコード例は問題ありません。GLKVector3構造体 (実際には共用体) であり、静的ではなく、値によって返されます。であるかのように正確に機能しintます。

2 番目のコード例は、書かれているとおりでは意味がありません (これifはオプティマイザによって削除され、警告が表示される可能性があります)。しかし、あなたはに似たものだったと言うので、間違っていると思います。それはあなたが投稿したものとは似ていませんでした。何かを見逃して、そのように理解したのはあなただけです. 説明が必要な場合は、実際のコードを投稿してください。

補遺

元のコードを見つける方法をコメントで書いたように、私は行って確認しました。元のコードは、2 番目の例とはかなり異なります。それは次のようなものです:

BOOL keepOn = YES;
...
while (keepOn) {
  ....
  switch (...) {
    case ...
      ...
    case ...
      ...
      keepOn = NO;
      break;
    default:
      ...
  }
}
...

これは理にかなっており、オプティマイザーによって何も削除されません。変数は静的ではありません。

于 2012-08-22T13:31:35.823 に答える