我在运行应用时收到此消息:
*** __NSAutoreleaseNoPool(): Object 0xadf5e50 of class __NSDate autoreleased with no pool in place - just leaking
我知道我需要在发生这种情况的线程的开头创建一个NSAutoreleasePool,但我不确定我的代码在哪里发生。是否可以设置一个断点,当有问题的对象被自动释放时将被击中?
答案 0 :(得分:2)
你可以在__NSAutoreleaseNoPool上设置一个符号断点,看看你点击它时所在的线程。这可以使用Xcode的Breakpoint Navigator底部的UI,或者如果您愿意,可以通过输入命令在GDB命令行上完成:break __NSAutoreleaseNoPool
答案 1 :(得分:1)
来自MallocStackLogging上的CocoaDev:
这是一个环境变量。当这个环境变量是 设置,在tcsh(例如)中使用“setenv MallocStackLogging 1”,然后 你可以在那个shell中启动任何应用程序。不要“打开”应用程序,启动它 从壳。执行此操作时,将跟踪所有malloc。然后说, 在另一个shell中,“泄漏”或“泄漏”会给你一个 此时应用程序中可能存在大量漏洞的列表。
然后,您可以循环执行一系列操作,并查看是否有数字 迭代之间的泄漏变化。泄漏有一个id,它保持不变 相同的应用程序的生命周期,大小,有时猜测 被泄漏的对象的类型,以及起始位的转储 泄露的数据。
确定如何最好地修复泄漏,以及如何解释一些泄漏 你在泄漏转储中看到的东西是另一回事。
答案 2 :(得分:0)
只需在线程的主要功能中添加自动释放池,即可解决内存管理问题。 喜欢这个
- (void)main
{
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
...
Your code here
...
[pool release];
}
或者如果您想使用新语法
- (void)main
{
@autoreleasepool {
... your code here ...
}
}
无论如何,您应该检查由工厂方法创建的或由您明确自动释放的所有NSDate。 NSDate类的所有工厂方法都列在下面
日期
dateWithNaturalLanguageString:
dateWithNaturalLanguageString:区域设置:
dateWithString:
dateWithTimeIntervalSinceNow:
dateWithTimeInterval:sinceDate:
dateWithTimeIntervalSinceReferenceDate:
dateWithTimeIntervalSince1970: