【问题标题】:Destroy object in background thread Objective C在后台线程Objective C中销毁对象
【发布时间】:2014-10-11 16:55:42
【问题描述】:

我有一个绝对庞大的数组(大约 1000 万个对象,它们本身包含大量数据)。销毁这个对象会在主线程上造成大约 5 秒的相当长的延迟。虽然这只是一个针对大量数据的测试用例,但我希望能够 A) 更好地破坏它或 B) 将它推到某个后台线程上而死。我不太了解内存收集的运行时要求,但想要一个更好的解决方案,只旋转 5 秒。

所以问题是如何销毁非常大的对象而不会在主线程上面临长时间的析构函数等待。我正在使用 ARC,并且在合理的时间调用析构函数(设置为 nil)。有没有其他人处理过这个?是否有针对此类情况的设计原则或其他策略。

这是我在分析期间查看的内容

【问题讨论】:

  • 我假设你可以有另一个“收割者”线程,将你的对象发布到它,并取消设置你自己的引用。然后该对象应该保持活动状态,直到 reaper 接收并随后忘记它(此时应该在 reaper 线程上发生破坏)。
  • 您可能希望将对象分配为单个 C 结构数组而不是 Objective-C 对象,因为释放这样的 C 数组基本上不需要时间。
  • 您是否尝试过使用撤消堆栈?你不必摧毁它。应用退出时会被移除。
  • @cHao 任何关于如何实现收割线程的指针?
  • @mikeD 这会起作用,但我确实希望它消失,只是不那么明显。这是我要清理的大约 1 gig 内存

标签: objective-c cocoa automatic-ref-counting dealloc


【解决方案1】:

我能够让事情在后台线程上运行并发布,执行以下操作:

    __block MyHugeObject* lastResults = self.localHugeObject; //retain it for the block
    self.localHugeObject = nil;//clear local copy

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{
        lastResults = nil;//release on a background thread
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 2011-09-18
    • 2018-03-31
    相关资源
    最近更新 更多