2011-08-27 69 views
1

我必须执行一项繁重的任务。当我在主线程中运行它时,一切都很完美,但是当我尝试从单独的线程运行任务时,出现的错误是“现在没有可供编程的内存:不安全的调用malloc”。OS X是否限制次要线程的内存使用量?

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

我的问题是:在辅助线程中是否存在内存限制(可能堆栈内存被削减?)?我试图用仪器进行调试,但没有泄漏,应用程序崩溃。

+0

在调用detachNewThread之前调用** autorelease **吗?如果你是这样的话,那么这个对象已经在你的主线程中自动释放了,然后你尝试从它已经离开的另一个线程访问它。 –

+0

@MaurícioLinhares不,我不是。事实上,在应用程序中甚至没有一个电话需要-autorelease。 –

+0

你为什么在讨论排除autorelease池的问题?这是在新的线程?在你的项目上启用NSZombie,它可能会帮助你 - > http://www.cocoadev.com/index.pl?NSZombieEnabled –

回答

1

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

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

但是,你必须分配对象,以便能够设置该属性。

+1

如果他得到的错误是“现在没有可用的程序存储空间:不安全的调用malloc',我想也许问题出在堆上。如果他没有堆栈内存,他会得到一个堆栈溢出;-) –

+1

@Chaitanya Gupta如果涉及堆,我认为主线程会导致同样的问题。 – JohnBrighton

1

主线程有一个1MB的堆栈,二级堆栈的默认堆栈大小为512KB。

你会得到这个错误信息是你用完了堆栈空间,因为它在主线程上工作,但不是次要的我会说这正是你的问题。

如果可以的话,我的第一个建议是减少递归,因为512KB开头的时候非常慷慨,增加大小可能只会让你的麻烦发生。有可能,直到该应用程序处于最终用户手中时,才会为一星评论疯狂地崩溃。

如果你想要一个更大的堆栈,那么你必须自己实例化,配置和启动堆栈。像这样:

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

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

相关问题