【问题标题】:Create autorelease pool on posix thread在 posix 线程上创建自动释放池
【发布时间】:2013-02-04 16:09:03
【问题描述】:

我正在使用GTMLogger 函数在我的应用程序中格式化日志记录。此应用程序创建实时 posix 线程(音频数据包处理)。有时我们需要从这些非 Cocoa 线程中执行日志记录。 GTMLogger 创建自动释放的对象,我想在函数中的 GTMLogger 调用上放置一个 @autoreleasepool 块,该函数来自非 Cocoa 线程的日志,但我担心它会影响性能。

我的问题是 - 我可以以某种方式创建自动释放池并将其与当前 posix 线程相关联,因此每个线程只创建一次池,而不是每次调用 log 函数时创建池?

提前致谢

【问题讨论】:

  • 当你创建 pthread 时,你传递了一个方法来调用它,所以你不能把 @autoreleasepool 放在这个顶级方法中,就像 main.m 在 Xcode 生成的应用程序中一样?
  • 这就是问题所在,线程不是在我的代码中创建的,而是在一些 3rd 方 SDK 库中创建的。实际调用这个函数的代码实际上并不知道它是从哪个线程调用的。

标签: ios objective-c pthreads nsthread nsautoreleasepool


【解决方案1】:

在 ARC 下,使用 @autoreleasepool 非常快。如果您担心那里的性能,我会更担心首先避免不必要的日志记录调用,而不是自动释放池。

如果线程是长期存在的,您通常不能创建与“线程”相关联的池。您需要定期排空池,如果您只是将整个线程主函数括在 @autoreleasepool{} 或类似的任何内容中,则不会发生这种情况。

【讨论】:

  • 赞成你的答案,你是对的,避免不必要的日志调用。
【解决方案2】:

好吧,如果您无法控制线程的主函数,那么我想您能做的最好的事情就是将自动释放池放置在该库“调用”到您控制的代码中。

【讨论】:

  • 我的函数是从音频流 posix 线程调用的。我担心的是在函数内容上创建自动释放池会影响音频质量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-11-19
  • 1970-01-01
  • 2020-09-10
  • 1970-01-01
  • 1970-01-01
  • 2020-03-15
  • 2011-07-01
相关资源
最近更新 更多