NSLog如何解决优化错误?

时间:2011-12-09 19:53:02

标签: iphone objective-c compiler-optimization

我的应用程序通过NSOperationQueue创建辅助线程。 在主线程中,它将消息写入缓冲区,这是全局变量。 在辅助线程中,它等到带有新行字符的消息到达。 它没有优化选项,效果很好。 如果我使用任何优化选项(-O1~ -Os)进行编译,它将保持while循环。 但如果我在内部循环中编写NSLog,它就可以工作。 这是什么问题? 有没有更好的方法可以在不使用NSLog的情况下解决这个问题?

while (!strchr(buffer, '\n')) {
    NSLog(@"!");   // without this, in optimized mode, it stays in while loop.
}

1 个答案:

答案 0 :(得分:5)

您的buffer可能是not declared volatile。编译器可以假设没有其他人更改buffer,并将循环转换为:

char* res = strchr(buffer, '\n');
while (!res) {}

这可能是一个无限循环。

使用NSLog,编译器不能假设NSLog不会弄乱全局变量,因此不会考虑条件。


如果你想等待另一个线程准备就绪,请至少使用条件变量(NSCondition)而不是无限循环。或者可以重新设计代码库以使用GCD