0

このコードが機能するのはなぜですか?

// in a constants file:

#define ADFadeOutSpeed 1.1



// then, later, in another file:

-(void)fadeOut:(UIView *)sender{
    [UIView beginAnimations:nil context:nil];
    [UIView setAnimationDuration:ADFadeOutSpeed];
    sender.alpha = 0.0;
    [UIView commitAnimations];
}

私は、ADFadeOutSpeed が強く型付けされていないとコンパイラが文句を言うだろうと予想していました。

4

3 に答える 3

6

#define は変数やオブジェクトを作成しないため、「foo のすべてのインスタンスを bar に置き換える」というコンパイラ コマンドです。つまり、コードに表示されるたびにADFadeOutSpeed が1.1 として読み取られます。 . コンパイラは以下を認識しません:

[UIView setAnimationDuration:ADFadeOutSpeed];

それは見える

[UIView setAnimationDuration:1.1];
于 2012-05-03T02:13:41.567 に答える
3

前処理されたときの単なるテキスト置換です。つまり、コンパイルが行われる前にテキストが置き換えられます。

于 2012-05-03T02:13:38.687 に答える
2

#define変数ではなく、C プリコンパイラ マクロです。コードがコンパイルされる前にADFadeOutSpeed、文字列が文字列に置き換えられることを指定しています。1.1コンパイラ自体に関する限り、評価している式はリテラルとして[UIView setAnimationDuration:1.1];解釈されるため、コンパイラの警告は表示されません。1.1

于 2012-05-03T02:15:06.520 に答える