在没有池的情况下自动释放 - 没有启动新线程

Posted

技术标签:

【中文标题】在没有池的情况下自动释放 - 没有启动新线程【英文标题】:autoreleased with no pool in place - NO new thread is started 【发布时间】:2012-06-11 10:07:02 【问题描述】:

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

感谢您的任何见解。

更新: 类XYZ.m ... 静态 BOOL skipFlag = NO;

二传手: + (void)setSkipFlag:(BOOL)boolValue 跳过标志 = 布尔值;

用法: [ClassXYZ setSkipFlag:YES];

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

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

【问题讨论】:

非常好的案例:),请提供更多关于 if ( ![ClassXYZ getSkipFlag] ) 的代码或发布打印此内容的调用者函数 感谢 Omar,请查看更新。 只是出于好奇,如果您将函数调用放在 @autorelease 中,日志会消失吗? 好吧,奥马尔,看来你刚刚解决了我的问题。添加了 @autoreleasepool ... 并且日志消失了。出于某种原因,我认为这不适用于非弧项目,并且从不费心尝试它。 [我应该在***.com/questions/7950583/… 之前检查一下。非常感谢,请添加答案,以便我接受您的解决方案。 有趣的是,如果我创建了一个自动释放池,然后在最后将其排空,它就不起作用了。 【参考方案1】:

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

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

【讨论】:

谢谢蒂亚。添加了 +(void)initializeskipFlag=NO; 但它没有帮助。我使用了静态 BOOL skipFlag; .m 文件中的这种情况。【参考方案2】:

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

【讨论】:

以上是关于在没有池的情况下自动释放 - 没有启动新线程的主要内容,如果未能解决你的问题,请参考以下文章

使用 [NSObject load] 初始化没有自动释放池的系统

安全的 NSArray 访问

关于Linux下pthread线程释放内存的讨论

具有大量自动释放对象的线程如果是/否,在这种情况下是不是必须使用自动释放池,为啥?

胡思乱想JNI与线程池的维护

在没有 Objective-C 的情况下使用 Apple 自动释放池