方法签名是......
- (void)blahBlahBlah:(NSString*)format, ... NS_FORMAT_FUNCTION(1,2) {
va_list args; va_start(args,format);
void(^SOME_BLOCK)(void) = ^{ [Heathens prayToJesusWith:
[NSString.alloc initWithFormat:kFMT
arguments:args]; }; ...
va_end(args);
}
然而,Xcode在args
... SOME_BLOCK
内抱怨Cannot refer to declaration with an array type inside block
。为什么不?这是“范围内”,不是吗?试过__block va_list
无济于事。建议吗?理由?
答案 0 :(得分:6)
va_list
是一种opaque类型,它依赖于实现和平台。可能是在您的特定系统上实现为某种数组。块无法捕获数组类型的变量。 C标准对va_list
的使用施加了某些限制,但没有明确提及块的任何问题。
如果您确定该块将在此函数的生命周期内运行(无论如何它都必须运行;因为args
仅在va_start
和va_end
之间有意义),解决方案是创建另一个va_list *
变量,设置为&args
,然后在需要使用它时捕获它并取消引用它。