【问题标题】:using autorelease in ARC enabled projects [duplicate]在启用 ARC 的项目中使用自动释放 [重复]
【发布时间】:2012-10-19 11:39:12
【问题描述】:

可能重复:
ARC memory leaks

我们可以在启用 ARC 的项目中使用 @autorelease 池吗?如果是这样,使用@autorelease 池有什么用。我在 google 中发现,即使项目启用了 ARC,它也只会处理主线程。如果我们创建其他线程,那么我们必须注意释放对象。 谁能解释一下

【问题讨论】:

  • 您是否要从 ARC 中删除特定文件
  • 感谢您的即时回复。我想你没有得到我的问题。为什么 ARC 不负责释放在其他线程中创建的对象。
  • ARC 仅适用于目标 - c。 & 一个应用程序还可以包含除目标之外的对象 - c。这就是为什么您发现 ARC 无法与其他线程一起使用。这只是你的错觉。实际上 ARC 会处理所有包含目标对象的线程 - conly。
  • @ForamMukundShah 如果你这么认为,我只能建议你做一件事:在写完全错误的东西之前阅读 ARC 的文档。
  • @H2CO3 我确实遇到过这样的问题。 &我已经阅读了文件。这就是我写这篇文章的原因。仅供参考,名称本身表明它可能是 Objective-C - Automatic Reference Counter 。或 Objective-C++ - 自动引用计数器

标签: iphone ios memory-management nsautoreleasepool


【解决方案1】:

是的,ARC 默认只设置在主线程上。但是,您也可以在后台线程中利用它。解决方案很简单:@autoreleasepool { } 的语义对于 ARC 是不同的;它实际上并没有像经典的 MRC 方式那样分配和释放 NSAutoreleasePool 对象,它只是告诉 ARC 处理调用它的线程中的对象,实现自动释放池样式的效果。

【讨论】:

  • ARC 只设置在主线程上?你能详细解释一下吗?哪部分代码在主线程下?
  • @jithen 直接从main() 及其祖先执行的线程,无需创建新线程 - i。 e.所有用户界面代码。更准确地说,所有未被调用的代码都使用主队列以外的队列。
  • 我刚刚创建了一个启用 ARC 的项目并启动了一个线程。在新线程中,我分配了一个对象并且没有释放它。因此,如果我在 Xcode 中进行分析,根据您的说法,它应该会引发潜在的泄漏。但事实并非如此,它不会引发任何潜在的泄漏
  • code sn-p: 我把这段代码放在 ViewDidload 方法中 pThread = [[NSThread alloc]initWithTarget:self selector:@selector(myMain) object:nil]; [pThread 开始];现在我在 myMain 函数中为一个字符串分配了内存。如果这部分线程没有被 ARC 覆盖,那么它必须抛出潜在的泄漏,而不是抛出。
  • @jithen 内存泄漏不会引发异常,它们就在那里。
【解决方案2】:

当您从手动内存管理迁移到 ARC 时,您将替换:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release];

@autoreleasepool {

    }

阅读NSAutoreleasePool 文档和Advanced Memory Management Programming Guide 以获得更好的理解。

【讨论】:

  • 这如何回答这个问题?
猜你喜欢
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2011-12-18
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 2011-12-12
  • 1970-01-01
相关资源
最近更新 更多