【发布时间】: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{ ... } 并且日志消失了。出于某种原因,我认为这不适用于非弧项目,并且从不费心尝试它。 [我应该在stackoverflow.com/questions/7950583/… 之前检查一下。非常感谢,请添加答案,以便我接受您的解决方案。
-
有趣的是,如果我创建了一个自动释放池,然后在最后将其排空,它就不起作用了。
标签: ios ios5 memory-leaks static nsautoreleasepool