Iphone __NSAutoreleaseNoPool():类的对象0x753c2f0在没有池的情况下自动释放-只是泄漏

Iphone __NSAutoreleaseNoPool():类的对象0x753c2f0在没有池的情况下自动释放-只是泄漏,iphone,objective-c,xcode,Iphone,Objective C,Xcode,我已经有一段时间没有注意到我的控制台输出了,我突然注意到了很多奇怪的错误 \uuuu nsautoreleasenool():类的对象0x753c2f0在没有池的情况下自动释放-只是泄漏 \uuuu NSArrayM类的对象0x753c300在没有池的情况下自动释放-只是泄漏 我不知道发生在哪里 编辑 我用这个 [self performSelectorInBackground:@selector(startupStuff) withObject:sender]; 使用statupStuff我

我已经有一段时间没有注意到我的控制台输出了,我突然注意到了很多奇怪的错误

\uuuu nsautoreleasenool():类的对象0x753c2f0在没有池的情况下自动释放-只是泄漏

\uuuu NSArrayM类的对象0x753c300在没有池的情况下自动释放-只是泄漏

我不知道发生在哪里

编辑

我用这个

[self performSelectorInBackground:@selector(startupStuff) withObject:sender];
使用
statupStuff
我有这个

General *rdb = [[General alloc] autorelease];
[rdb refreshDBData];

错误发生在
refreshDBData
方法中的代码之后不久。

自动释放池绑定到线程。如果通过performSelectorInBackground创建线程,则需要为自己创建并销毁自动释放池。所以你需要的东西是这样的:

- (void)startupStuff:(id)sender
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    // ... everything else you were doing ...

    [pool drain]; //see comment below
}
另外:Richard在下面指出,drain比release更可取,以确认(在桌面上,而不是在iOS上)您可能正在使用垃圾收集器运行。苹果的具体词汇是():

在垃圾收集环境中,如果需要,向池发送排放消息将触发垃圾收集;然而,释放是不可操作的。在引用计数的环境中,排放与释放具有相同的效果。因此,通常应使用排水管而不是释放

所以我纠正了我的例子。可以说,这个特定的问题与iPhone有关,目前该设备上没有垃圾收集。因此,原始海报位于“排水管与释放具有相同的效果”阵营中,而不是“排水管…在必要时触发垃圾收集;然而,释放是一个“无操作”阵营。

试试这个

[self performSelectorInBackground:@selector(startupStuff) withObject:sender];

-(void)startupStuff:(id)sender
{

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

   General *rdb = [[General alloc] init];

   [rdb refreshDBData];

   [rdb release];

   [pool release];

}
如果它不起作用,那么您需要检查refreshDBData方法。。你在那里做错了什么

这是:

General *rdb = [[General alloc] autorelease];

这是错误的。应该始终调用初始值设定项;到
-init
,至少。

您的应用程序中是否使用多个线程?如果是这样,那么如果您没有在线程方法中放置NSAutoReleasePool,就会发生这种情况。您已经有了答案,所以这里只是一个注释,但是在调用
+alloc
之后立即调用
-autorelease
似乎是一个错误,也是一个坏习惯。为什么不调用
-init
?对于NSAutoreleasePool对象,drain更倾向于释放,因为它在GC和引用计数环境中都能工作。@Richard:谢谢你让我知道!很明显,我在iOS世界待的时间太长了。我已经更正了答案。