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 不会创建变量或对象,所以它是一个编译器命令,上面写着“用 bar 替换 foo 的所有实例”——所以发生的事情,退出精英,是 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 回答