10.5上的内存泄漏说即使我有自动释放池也没有?

时间:2013-10-23 19:18:29

标签: macos cocoa

我是cocoa / xcode的新手,我正在Xcode 4.3.2中编写一个cocoa应用程序 我的目标是10.5,基本SDK是10.7。我必须支持10.5以上。

我使用过手动内存管理,应用程序在10.7,10.8和10.9上运行良好。它似乎也适用于10.6。

在10.5(我没有系统但是从报告中)

我收到很多这些错误,

Oct 22, 2013 3:44:08 PM: *** _NSAutoreleaseNoPool(): Object 0x1126f49b0 of class NSCFString autoreleased with no pool in place - just leaking
Stack: (0x7fff823a11e8 0x7fff822b9771 0x10002cfb0 0x10002bc19 0x10002add1 0x7fff822bfd35 0x7fff8467ed0f 0x7fff8467ebd1)
Oct 22, 2013 3:44:08 PM: *** _NSAutoreleaseNoPool(): Object 0x1126f4c90 of class NSCFSet     autoreleased with no pool in place - just leaking
Stack: (0x7fff823a11e8 0x7fff822b9771 0x7fff82315748 0x10002bc52 0x10002add1 0x7fff822bfd35 0x7fff8467ed0f 0x7fff8467ebd1)

在我的代码中,我使用autoreleasepools来处理主线程以外的线程

@autoreleasepool
{
  //whatever code calling autorelease on objects..  
}

对于主线程,我没有提供任何池,假设它是自动提供的。我想知道上述错误是否因为autoreleasepool块与10.5不兼容?或者可能我自动提供关于主线程自动释放池的假设,即使10.5不正确?这至少在10.7以后是正确的。我不确定10.5会发生什么。

任何建议都会很棒..

2 个答案:

答案 0 :(得分:0)

@autorelease{}块是ARC引入的一个功能 - 后缀为10.5。

在ARC之前的日子里,你会使用这种结构:

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

  // Code benefitting from a local autorelease pool.

  [pool release];

...对于所有系统版本的非ARC代码仍然完全有效。

<强>更新

这个答案引起了一些争论(见下文)。当编译器看到@autorelease{}块时,它会使用它来生成上面的NSAutoreleasePool非块结构,因此不应存在版本兼容性问题。 然而,块本身是一项功能,仅从10.6开始提供。所以 - 虽然文档在这一点上很薄 - 但我相当肯定这是问题的原因。

缺乏10.5设置,我无法测试。也许其他人可以确认?

更新2
我似乎已经犯了大部分错误(不是第一次!)。

以下是信息from the Clang docs' introduction of @autoreleasepool

的金块
  

为了简化自动释放池的使用,并将它们置于编译器的控制之下,Objective-C中提供了一种新的语句。它写成@autoreleasepool后跟一个复合语句,即由大括号分隔的新范围。进入此块后,将捕获自动释放池的当前状态。当块正常退出时,无论是通过fallthrough还是定向控制流(例如return或break),自动释放池都将恢复到已保存状态,释放其中的所有对象。当异常退出块时,池不会耗尽。

     

@autoreleasepool可以在非ARC翻译单元中使用,具有等效的语义。

尤其是......

  
    

如果程序引用NSAutoreleasePool类,则程序格式不正确。

  

因为引入@autorelease{}

,所以直接解决NSAutoreleasePool

我现在会留下这个错误的答案,因为这些评论很有启发性。

答案 1 :(得分:0)

NSAutoreleaseNoPool()添加符号断点(如果您不熟悉如何执行此操作,请参阅dev forums)。当你以这种方式创建一个对象时,这将使你进入调试器,这将告诉你你遇到什么问题的确切线程。