最近,我试图调试一些代码,但我的想法让我感到困惑。我的问题的简化版本如下:
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循环正在执行,然后下面的代码作为“匿名块”运行。
Objective C中的匿名块有什么意义?何时/何地有用?
为什么我的代码不会在Xcode中产生某种警告?我想你可以把一段旧代码扔进一对额外的大括号中,然后你突然把它作为匿名块执行?
答案 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;。