1

不久前我遇到了这种语法:

[myView setFrame:({
    CGRect frame = myView.frame;
    frame.size.height = heightValue;
    frame;
})];

我不记得我在哪里看到的,但我想知道使用它而不是经典是否有任何优势:

CGRect frame = myView.frame;
frame.size.height = heightValue;
[myView setFrame:frame];
4

3 回答 3

6

前一种语法只是限制范围,frame以便可以在setFrame消息发送后回收用于创建它的临时存储。

然而,在我看来,这是在阅读代码以进行优化时增加脑力的事情之一,编译器几乎肯定会采取这种优化方式。

于 2013-09-20T14:50:19.717 回答
3

它防止frame在对 的调用范围之外setFrame:,但以牺牲可读性为代价。

于 2013-09-20T14:51:13.420 回答
1

第一种语法是 C 语言的 GNU 扩展,称为Statement Expression。它与任何 C 标准都不兼容,因此最好完全避免使用第二种语法,后者更具可读性。

于 2013-09-20T15:06:12.267 回答