OS X是否限制了辅助线程的内存使用量?

时间:2011-08-27 14:42:00

标签: ios multithreading cocoa macos exc-bad-access

我必须执行一项繁重的任务。当我在主线程中运行它时,一切都很好,但是当我尝试从一个单独的线程运行任务时,出现的错误是“现在没有可用于编程的内存:调用malloc不安全”。

我正在使用+[NSThread detachNewThreadSelector:toTarget:withObject:],并且在必要时我放置了所需的自动释放池(也就是说,在开始时我分配并初始化它,然后在最后我将其耗尽)。

我的问题是:在辅助线程上是否存在内存限制(可能是堆栈内存被切断?)?我曾尝试使用Instruments调试,但是没有泄漏,应用程序只是崩溃。

3 个答案:

答案 0 :(得分:2)

我不知道这是否有帮助,但您可以尝试使用队列而不是NSThreads。 link to Apple's documentation of "Migrating away from Threads"

答案 1 :(得分:1)

查看Apple的文档,您可以使用-setStackSize增加堆栈大小:。

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html

但是,您必须分配对象才能设置该属性。

答案 2 :(得分:1)

主线程的堆栈为1MB,辅助堆栈的默认堆栈大小为512KB。

如果你的堆栈空间不足,你会得到这个错误信息,因为它适用于主线程而不是辅助线程我会说这正是你的问题。

我的第一个建议是减少递归,如果可以的话,因为512KB是非常慷慨的开始,并且增加大小可能只会延迟你的麻烦。可能直到应用程序到最后,用户手中都会疯狂地进行一星评价。

如果您确实需要更大的堆栈,则必须自己实例化,配置和启动堆栈。像这样:

NSThread* t = [[NSThread alloc] initWithTarget:self
                                      selector:@selector(someSelector:)
                                        object:anArgument];
[t setStackSize:1024*1024];
[t start];

4K的最小堆栈大小,大小必须以4K为增量。