0

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 ...静态布尔skipFlag = NO;

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

用法:[ClassXYZ setSkipFlag:YES];

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

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

4

2 回答 2

1

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

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

于 2012-06-11T11:21:44.927 回答
0

只是出于好奇,如果您将函数调用放在@autorelease该日志中应该消失

于 2012-06-12T06:51:31.727 回答