12

我们正在将应用程序从 10.6 移植到 10.8。我正在查看我们在应用程序中加载的 dylib。我在垃圾收集工作队列中面临非常不寻常的崩溃,并显示以下消息。

malloc: Thread::suspend():  unable to suspend a thread:  err = 268435459, Thread 0x111000000: _pthread = 0x108129000, _thread = 0x8b07, _stack_base = 0x108129000, enlivening  on, 0 local blocks

为应用程序GCC_ENABLE_OBJC_GC = required设置。如果我有GCC_ENABLE_OBJC_GC = requireddylib 它仍然会崩溃。我无法在应用程序中关闭垃圾收集器。我必须从我的 dylib 中管理它崩溃。

崩溃的原因是垃圾收集器无法挂起线程。(正如它在日志中所说)。该线程是使用thread_create()创建的。如果我在 dylib 的构造函数中放置一个无限期的 while 循环(带睡眠),我不会崩溃。当构造函数完成执行时,我会崩溃。

他们是一种告诉垃圾收集器不要尝试挂起线程的方法吗?或者增加线程的引用计数?或者我可以做的任何事情来阻止垃圾收集器不干扰我的 dylib 代码。

4

2 回答 2

3
It is expected. 
Starting with OSX 10.8, Garbage collection is deprecated. So CG is unable to suspend the threads to perform its duty. As a result you get all the issues you are facing.

If you want to develop for 10.8, you need to convert to ARC (best) or move back to manual reference counting. If you wish to move to arc, see Transitioning to ARC Release Notes

来自 Apple 关于 10.8 的文档:

重要提示:从 OS X v10.8 开始,垃圾收集已被弃用。请改用 ARC(自动引用计数)。要了解有关 ARC 的更多信息,请参阅过渡到 ARC 发行说明。

https://books.google.co.in/books?id=8nzwsciij20C&pg=PT431&lpg=PT431&dq=Crash+of+Garbage+Collection+Work+in+objective+c&source=bl&ots=xTjLETFMsO&sig=b33rLeXJVh1WtnAvcVJykfNtvOU&hl=en&sa=X&ved=0ahUKEwiyqZrC2rvNAhVKNI8KHZRdC7AQ6AEIKDAC# v=onepage&q=崩溃%20of%20Garbage%20Collection%20Work%20in%20objective%20c&f=false

于 2016-06-22T13:19:30.040 回答
-1

我们正在将应用程序从 10.6 移植到 10.8。崩溃的原因是垃圾收集器无法挂起线程。

这是预期的。
从 OSX 10.8 开始,垃圾收集已被弃用。因此 CG 无法暂停线程来执行其职责。结果,您会遇到所有面临的问题。

如果要为 10.8 开发,则需要转换为 ARC(最佳)或返回手动引用计数。如果您希望迁移到 arc,请参阅Transitioning to ARC Release Notes


来自 Apple 关于 10.8 的文档:

重要提示:从 OS X v10.8 开始,垃圾收集已弃用。请改用 ARC(自动引用计数)。要了解有关 ARC 的更多信息,请参阅过渡到 ARC 发行说明。

资料来源:OS X v10.8 Mountain Lion 的新增功能

答案:

  • 他们是一种告诉垃圾收集器不要尝试挂起线程的方法吗?

不,这就是它的工作原理。

  • 或者增加线程的引用计数?或者我可以做的任何事情来阻止垃圾收集器不干扰我的 dylib 代码。

不。由于 GC 在 10.8 下已被弃用,因此如果您希望支持 10.8,则必须将其删除。

GC 在 MAC 平台上一直是一个非常短暂的技术。并因各种原因被ARC取代。

于 2013-04-06T12:58:29.953 回答