“类NSCFString的对象0x84be00自动释放,没有池到位 – 只是泄漏” – 但在应用程序的第一行!

在我的iPhone应用程序中,在应用程序的最开始,我在控制台中收到三个奇怪的警告,然后调用任何代码:

*** __NSAutoreleaseNoPool(): Object 0x84be00 of class NSCFString autoreleased with no pool in place - just leaking *** __NSAutoreleaseNoPool(): Object 0x84b000 of class NSCFString autoreleased with no pool in place - just leaking *** __NSAutoreleaseNoPool(): Object 0x849c00 of class NSCFString autoreleased with no pool in place - just leaking 

我在许多地方使用MBProgressHUD来显示进度指示器,这是该问题的一些其他讨论所指出的,因为它在显示进度指示器时抛出一个新线程。 但最奇怪的是,这些似乎甚至在我的main()函数的开头之前抛出:

 int main(int argc, char *argv[]) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; int retVal = UIApplicationMain(argc, argv, nil, nil); [pool release]; return retVal; } 

当我在第一个NSAutoreleasePool上的代码中放置一个断点时,在该行甚至运行之前我得到了这个警告。 什么可能导致错误,据说,在此之前我没有运行任何我自己的代码?

你可能有一个构造函数在main()之前运行,触发了这个问题。 您链接哪些库和/或您正在使用任何__attribute__指令?


HERP。

意识到明显的东西。 由于物体泄漏,它们仍然存在。 在main()上设置断点,然后在GDB提示符下键入po 0x84be00 (仅将0x84be00替换为泄漏的其中一个字符串的地址)。

那将向您展示该字符串的内容,并为您提供一个非常好的线索,了解原因是什么。

DERP。

__NSAutoreleaseNoPool上设置断点,看看回溯显示给你的是什么。

我今天明显失败了(唯一明显的是因为我已经走了这条路18,273.14万次)。

你在app中的某个地方有一个静态变量,它在主runloop之外被初始化。 就像是:

 static UIImage *myImage = [UIImage imageNamed:@"fred.png"]; 

查找初始化对象的任何静态变量,并在诸如applicationDidFinishLaunching之类的内容中初始化它们,以便在适当的位置使用自动释放池进行设置。

尽管它说NSString正在泄漏,但它可能是任何类型的对象。

在使用后台线程的应用中,您需要在后台方法中创建自动释放池:

 -(void)myMethodThatRunsOnBackground:(id)param { NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; //body of method [pool release]; } 

回复信用: iphonedevsdk.com上的nobre84

我正在寻找这个问题的答案,但我设法解决了一些研究后的问题。 我也有这个错误发生在main执行之前,我通过实现一个名为+(void)加载的方法跟踪它,我认为这是一个很好的名称来加载一些全局类特定的数据。 我没有意识到加载实际上已经定义了,我使用它是覆盖默认加载,并且在main之前执行加载。 因此,我在泄漏。 将其重命名为myload修复它。

您可以尝试为autorelease设置一个符号断点,以查看调用它的位置和时间。