自动释放没有池到位 - 没有新线程启动

时间:2012-06-11 10:07:03

标签: ios ios5 memory-leaks static nsautoreleasepool

  

objc [23601]:类__NSCFSet的对象0x12b090f0自动释放,没有池到位 - 只是泄漏 - 在objc_autoreleaseNoPool()上打破调试

为什么以下代码部分会打印上面的泄漏错误?

+ (BOOL)getSkipFlag
{

    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
    if ( ![defs objectForKey:_BOOK_ID] )
    {
        [defs setObject:@"yyyy" forKey:_BOOK_ID];

        [defs synchronize];
    }

    if ( ![[defs objectForKey:_BOOK_ID] isEqualToString:@"xxxx"] )
    {
        return NO;
    }

    return skipFlag;
}

使用

if ( ![ClassXYZ getSkipFlag] )
....

我不使用新线程,因此我不应该设置新的自动释放池。

注意:NSString *temp = [[NSBundle mainBundle] pathForResource:_CONFIG_PLIST ofType:@"plist"]; - 会打印相同的错误 我使用的是iOS 5.1

感谢您的任何见解。

更新: ClassXYZ.m ... static BOOL skipFlag = NO;

设定器:     +(void)setSkipFlag:(BOOL)boolValue     {         skipFlag = boolValue;     }

用法: [ClassXYZ setSkipFlag:YES];

用于 静态无效 convert_uri_to_file_name(struct mg_connection * conn,const char * uri,         char * buf,size_t buf_len)

奥马尔你对它的使用位置有一个很好的观点。事实证明,如果我使用ClassXYZ自己的实例方法,它可以正常工作。

2 个答案:

答案 0 :(得分:1)

通常,主线程的自动释放池将在main函数的第一行创建。在main函数之前运行的任何内容都会看到自动释放池不存在。

+load函数是导致泄漏的一个原因,因为它在main函数之前运行。如果是这种情况,请考虑改为使用+initialize

答案 1 :(得分:0)

只是出于好奇,如果你把函数调用放在@autorelease里面,日志应该消失