({})在Objective-c中可以包装代码并返回一个对象,它是块还是其他?

袁达文

我今天有一个摘要

self.tableView = ({
    CGRect frame = CGRectMake(0.f, 0.f, kBPNavigationBarClockInOutAssociatesTableViewWidth,
                              kBPNavigationBarClockInOutAssociatesTableViewHeight);
    UITableView * tableView =
        [[UITableView alloc] initWithFrame:frame style:UITableViewStylePlain];
    tableView.autoresizingMask = (UIViewAutoresizingFlexibleTopMargin
                                  |UIViewAutoresizingFlexibleBottomMargin
                                  |UIViewAutoresizingFlexibleWidth);
    tableView.delegate   = self;
    tableView.dataSource = self;

    [tableView setOpaque:NO];
    [tableView setScrollEnabled:YES];
    [tableView setBounces:YES];
    [tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
    [tableView setBackgroundView:nil];
    [tableView setBackgroundColor:[UIColor clearColor]];

    tableView;
});
  • 第一个问题:

({})很有意思,它可以在同步模式下运行包装的代码,并在其内容的末尾返回tableView的对象。

我只是认为这是一个块,但是为什么它看起来不是这样:

UITableView * (^testBlock) (void) = ^{ // Codes here... return tableView;};
UITableView *myTableView = testBlock();
  • 第二个问题

当我在Xcode中测试代码时,({})不在异步模式下,但是根据我的经验,该块始终(异步运行在块上吗?)。那么为什么不在这里呢?

  • 第三题

当我使用返回对象对块语法进行谷歌搜索时,我发现所有块都返回原始值,例如BOOL和Double,并且没有足够的幸运找到一个返回对象的对象。块只能返回原始值,这是真的吗?

复习:

我在为什么这个基本的Objective C块代码无法正常工作时找到了这个代码片段

NSString *(^print_block)() = ^{
    return @"this block worked!";  
};
NSLog(@"%@", print_block());

所以我认为一个块也可以返回一个对象类型。

非常感谢!

经过

我想我会把我的评论作为答案。这不是一个障碍。这是GCC / LLVM中一种有趣的编译器/代码机制的情况,称为“表达式中的语句和声明”

它使您能够执行任意代码块,并使最后一条语句成为赋值的返回值。因此,在您的情况下,返回的内容是最后一行tableview

就我个人而言,我认为这里使用它的方式令人困惑。函数或仅内联编写该代码可能会更好。

这个用例(至少我已经找到了)通常在开发预处理器宏中,这些宏执行带有自动变量的一些代码并返回其值,例如:

#define pow( _x ) ({ int x = (_x); x*x; })

举一个简单的例子,也许不是那么好,因为我假设的值_x可分配给int,但您明白了。请注意,在此宏中如何_x只被评估一次

与其他类型的宏评估相比,我主要在这里看到此语法的实用程序。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章