目标C:匿名块,为什么以及何时?

时间:2012-10-04 17:39:13

标签: objective-c c xcode block

最近,我试图调试一些代码,但我的想法让我感到困惑。我的问题的简化版本如下:

for(int x = 0; x < [myArray count]; x++);
{
    //perform some action
}

问题是我想要执行的操作只会发生一次。当然,我最终注意到问题是我在for循环结束时不小心包含了一个额外的分号。

for(int x = 0; x < [myArray count]; x++);<---- Oops!
{
    //perform some action
}

但后来我想知道......为什么那个代码甚至有点工作?结果发现我的for循环正在执行,然后下面的代码作为“匿名块”运行。

  1. Objective C中的匿名块有什么意义?何时/何地有用?

  2. 为什么我的代码不会在Xcode中产生某种警告?我想你可以把一段旧代码扔进一对额外的大括号中,然后你突然把它作为匿名块执行?

2 个答案:

答案 0 :(得分:6)

它们可用于确定变量的范围。虽然它更像是一种排版,但是当你需要自定义一系列相同类型的对象时,它可以很方便,允许你重复使用相同的变量。比如说你正在设置一些NSURLRequests

NSMutableArray *requests = [NSMutableArray array];
{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    request.URL = [NSURL URLWithString:@"http://A"];
    request.HTTPMethod = @"GET";
    [requests addObject:request];
}
// ... etc
{
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init];
    request.URL = [NSURL URLWithString:@"http://Z"];
    request.HTTPMethod = @"POST";
    [requests addObject:request];
}

答案 1 :(得分:0)

启用CLANG_WARN_EMPTY_BODY,您将收到此警告。您应该仔细检查可以在Xcode中启用的所有警告,并打开所有有用的内容(所有内容都不会对代码提供很多警告,这些警告非常好)。

该功能本身出现在1970年代后期的第一个C版本中。

并且从未听说过这被称为&#34;匿名阻止&#34;。这是一个复合陈述。有时候它被称为块,但我从来没有听过“匿名块”这个术语&#34;。