如果基于 Xcode 7 而不是 Xcode 8,.mm 文件可以工作

.mm file works if built on Xcode 7 but not on Xcode 8

我正在调用第三方开发人员编译的 C 库中的函数,我不能透露。问题是函数 returns 在使用 Xcode 8 构建应用程序时出错,但在使用 Xcode 7 时工作正常。我在我的应用程序中从 .mm 文件调用库函数。我知道这有可能是由第 3 方库引起的,但是 Xcode 版本中的哪些变化可能会影响到这一点?我不知道从哪里开始,也无法在此处粘贴代码。

我想出了一个解决方法,但仍然不知道为什么会这样。 我发现错误的原因是 Optimization Level。在 XCode 8 时,我需要设置优化级别才能正常工作,否则它会失败。

具体失败的源码是这样的:

char subject[256];
memset(&subject, 0x00, sizeof(subject));
strcpy(subject, "Test");
mail.emailSubject = subject

我用这个替换了上面的代码:

mail.emailSubject = (char*)"Test";

如果有人能解释一下,请随意。谢谢!

第一段代码是分配一个堆栈字符数组,然后将其分配给我不知道是什么类型的对象的emailSubject。如果它不复制堆栈内存而只是分配它,那么当函数 returns 堆栈内存将被释放并且 emailSubject 将持有脏内存。

当分配 "Test" 时,编译器将分配 "Test" 作为静态变量,该变量不会在函数 returns.

后释放

希望对您有所帮助。