我们正在为 Mac OSX (10.8) 开发一个需要使用 JavaScript 库的 Cocoa 应用程序(为什么我们必须使用 JavaScript 很长的故事)。
在演示应用程序中,一切似乎都很好,但是在将代码合并到我们的项目中时,我们可以毫无问题地调用该函数 37 次,然后第 38 次崩溃。
要调用 JS 代码,我们使用 Apple 的 JSWrappers.m(来自 JavaScriptCoreHeadStart 示例)。崩溃的行(带有 EXC_BAD_ACCESS)是 #149:
JSObjectCallAsFunction(self.jsContext, jsFunction, NULL, argumentCount, arguments, NULL);
如上所述,它在第 38 次-callStringJSFunction:withParameters:
被调用时崩溃,无论输入是什么(它与任何输入字符串一起崩溃,并且如果在之前的 37 次迭代中使用相同的字符串)。EXC_BAD_ACCESS 不是由输入变量引起的,因为访问它们(例如self.jsContext
在该行之前立即调用)是有效的:导致崩溃的是函数调用本身。
我们不知道它可能导致此问题的原因,也不知道如何进行更多调试。有没有人有任何提示?谢谢。
//编辑
我必须纠正自己:它也不适用于“演示应用程序”。即使在这种情况下,代码在我们第 38 次调用时也会崩溃-callStringJSFunction:withParameters:
//编辑2
如果我们在每次调用该函数时重新创建 JSWrappers 对象(和一个新的 JSGlobalContext),它就不会再崩溃了。然而,这使得代码变慢了很多(不足为奇,因为 JS 解释器每次都必须读取脚本 - 这是一个相当大的脚本)。
//编辑3
另一个发现:以 32 位构建应用程序会导致代码崩溃。相反,以 64 位构建可以完美运行:JS 代码在我们希望的任何时候都可以毫无问题地执行。这很奇怪:这可能是 JavaScript Core 框架本身的错误吗?