NSLog如何解决优化错误?

use*_*621 3 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.
}
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 5

buffer可能没有申报volatile.编译器可以假设没有其他人更改buffer,并将循环转换为:

char* res = strchr(buffer, '\n');
while (!res) {}
Run Code Online (Sandbox Code Playgroud)

这可能是一个无限循环.

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


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