【发布时间】:2023-03-09 06:50:01
【问题描述】:
我必须执行一项繁重的任务。当我在主线程中运行它时,一切都很好,但是当我尝试从单独的线程运行任务时,出现的错误是“No memory available to program now: unsafe to call malloc强>”。
我正在使用+[NSThread detachNewThreadSelector:toTarget:withObject:],并在必要时放入所需的自动释放池(即在开始时分配并初始化它,然后在最后将其耗尽)。
我的问题是:辅助线程上是否存在内存限制(可能是堆栈内存被削减了?)?我尝试使用 Instruments 进行调试,但没有泄漏,应用程序只是崩溃了。
【问题讨论】:
-
在调用 detachNewThread 之前你是在调用 autorelease 吗?如果是,则该对象已经在您的主线程中自动释放,然后您尝试从它已经消失的其他线程访问它。
-
@Maurício Linhares 不,我不是。实际上,应用程序中甚至没有一个调用 -autorelease。
-
你为什么要说清空自动释放池?这是在新线程上吗?在您的项目上启用 NSZombie,它可能会对您有所帮助 -> cocoadev.com/index.pl?NSZombieEnabled
-
@Maurício Linhares NSAutoreleasePool 被放置在新线程中,最后我调用 -drain。我现在正在尝试使用僵尸,谢谢您的建议。
-
您是否在线程上运行循环?如果是这样,请尝试在循环内部使用自动释放池。
标签: ios multithreading cocoa macos exc-bad-access