我是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会发生什么。
任何建议都会很棒..
答案 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{}
我现在会留下这个错误的答案,因为这些评论很有启发性。
答案 1 :(得分:0)
为NSAutoreleaseNoPool()
添加符号断点(如果您不熟悉如何执行此操作,请参阅dev forums)。当你以这种方式创建一个对象时,这将使你进入调试器,这将告诉你你遇到什么问题的确切线程。