我必须执行一项繁重的任务。当我在主线程中运行它时,一切都很好,但是当我尝试从一个单独的线程运行任务时,出现的错误是“现在没有可用于编程的内存:调用malloc不安全”。
我正在使用+[NSThread detachNewThreadSelector:toTarget:withObject:]
,并且在必要时我放置了所需的自动释放池(也就是说,在开始时我分配并初始化它,然后在最后我将其耗尽)。
我的问题是:在辅助线程上是否存在内存限制(可能是堆栈内存被切断?)?我曾尝试使用Instruments调试,但是没有泄漏,应用程序只是崩溃。
答案 0 :(得分:2)
我不知道这是否有帮助,但您可以尝试使用队列而不是NSThreads。 link to Apple's documentation of "Migrating away from Threads"。
答案 1 :(得分:1)
查看Apple的文档,您可以使用-setStackSize增加堆栈大小:。
但是,您必须分配对象才能设置该属性。
答案 2 :(得分:1)
主线程的堆栈为1MB,辅助堆栈的默认堆栈大小为512KB。
如果你的堆栈空间不足,你会得到这个错误信息,因为它适用于主线程而不是辅助线程我会说这正是你的问题。
我的第一个建议是减少递归,如果可以的话,因为512KB是非常慷慨的开始,并且增加大小可能只会延迟你的麻烦。可能直到应用程序到最后,用户手中都会疯狂地进行一星评价。
如果您确实需要更大的堆栈,则必须自己实例化,配置和启动堆栈。像这样:
NSThread* t = [[NSThread alloc] initWithTarget:self
selector:@selector(someSelector:)
object:anArgument];
[t setStackSize:1024*1024];
[t start];
4K的最小堆栈大小,大小必须以4K为增量。