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自己的实例方法,它可以正常工作。答案 0 :(得分:1)
通常,主线程的自动释放池将在main
函数的第一行创建。在main
函数之前运行的任何内容都会看到自动释放池不存在。
+load
函数是导致泄漏的一个原因,因为它在main
函数之前运行。如果是这种情况,请考虑改为使用+initialize
。
答案 1 :(得分:0)
只是出于好奇,如果你把函数调用放在@autorelease
里面,日志应该消失