由编译器优化的变量

Boi*_*ill 1 iphone objective-c

我开始调试一些试图找出错误的代码.当我尝试p tlEntries从调试器中获取时

<variable optimized away by compiler>

if语句上停止的消息.以下是我的代码:

NSArray *tlEntries = [[NSArray alloc] initWithArray:[self fetchJSONValueForURL:url]];
for (NSDictionary *info in tlEntries) 
{
    if ([info objectForKey:@"screen_name"] != nil)
         NSLog(@"Found %@ in the timeline", [info objectForKey:@"screen_name"]);
}
Run Code Online (Sandbox Code Playgroud)

早期的调试让我相信URL确实返回了有效的NSArray,但我不明白为什么tlEntries被"优化掉".

Mas*_*aro 17

正确的解决方案是以不同的方式声明变量,如下所示:

volatile NSArray *tlEntries;
Run Code Online (Sandbox Code Playgroud)

实际上,volatile关键字正好用于通知编译器它不能以任何方式尝试优化与该变量相关的代码.亲切的问候.

  • 我真的不明白这里的反对票.我给出了一个正确的答案,并将问题解决了(请尝试搜索Objective C文档或使用google查找Objective C,C和C++中volatile关键字的确切含义). (2认同)

Die*_*Epp 6

编译器可能注意到你只在开始时使用了两次tlEntries,并且在循环中根本不使用它.如果我没记错的话,循环会创建一个枚举对象,而不是保持对容器对象的引用.所以tlEntries应该对第一行有效,但其余部分则有效.

想法:您可以通过在函数后面的某处使用tlEntries来强制编译器保留它.就像是

NSPrint(@"IGNORE THIS LINE %p", tlEntries);
Run Code Online (Sandbox Code Playgroud)

更好的想法:您可以将优化设置为-O0.强烈建议您调试代码.如果使用"Debug"而不是"Release"构建,它应该自动设置为-O0,但您可以更改它.