在我的应用程序中,我有以下Objective-C代码:
-(void)layoutPages
{
NSMutableArray* sections = [NSMutableArray array];
[sections addObject:[[NSAttributedString alloc] initWithString:@"Hello world"]];
for (NSAttributedString* contentSection in sections) {
NSLog(@"%@",contentSection);
}
}
控制台输出:2014-04-22 14:11:01.505 MyApp[24784:830b] Hello world{}
如果我使用-Os优化编译x86_64架构,那么LLVM会默默地优化循环变量'contentSection'。当我使用-O0时,bug就会消失。 当我尝试打印contentSection变量的描述时,这是输出:
(lldb) po contentSection
error: Couldn't materialize struct: the variable 'contentSection' has no location, it may have been optimized out
Errored out in Execute, couldn't PrepareToExecuteJITExpression
怎么可能?从我的角度来看,在循环中使用时,循环变量永远不应该被优化掉。我已经看到其他人与LLVM有类似的问题,但没有循环变量。这可能是编译器错误吗?
答案 0 :(得分:3)
这可能是编译器设置问题。首先,您需要检查您的运行方案是否处于发布模式。转到“编辑方案...” - > “运行” - > “信息” - > “构建配置”。确保将值设置为“Debug”。
如果这不是问题,请确保您的调试版本设置没有打开编译器优化。确保“优化级别”设置为“无”以进行调试。还要确保没有其他可以设置编译器优化级别的位置,例如“其他C标志”设置。