__NSAutoreleaseNoPool():对象0x753c2f0类通用自动释放没有池到位 - 只是泄漏

时间:2010-11-30 11:16:24

标签: iphone objective-c xcode

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

__NSAutoreleaseNoPool(): Object 0x753c2f0 of class General autoreleased with no pool in place - just leaking

__NSAutoreleaseNoPool(): Object 0x753c300 of class __NSArrayM autoreleased with no pool in place - just leaking

我不知道这发生了什么?

编辑..

我用这个

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

statupStuff我有这个

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

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

3 个答案:

答案 0 :(得分:16)

自动释放池与线程绑定。如果通过performSelectorInBackground创建线程,则需要为自己创建和销毁自动释放池。所以你需要startupStuff看起来像这样:

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

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

    [pool drain]; //see comment below
}

另外:下面的Richard指出,排放是最好的释放,以确认(在桌面上,还没有在iOS上)你可能正在运行垃圾收集器。 Apple的具体单词是(source):

  

在垃圾收集环境中,向池中发送排放消息会在必要时触发垃圾回收;然而,释放是一种无操作。在参考计数环境中,排水与释放具有相同的效果。因此,通常情况下,您应该使用排水而不是释放。

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

答案 1 :(得分:4)

此:

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

错了。应始终调用初始化程序;到-init,至少。

答案 2 :(得分:0)

试试这个

[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方法..你在那里做错了什么