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...静态布尔跳过标志 = 否;
二传手: + (void)setSkipFlag:(BOOL)boolValue { skipFlag = boolValue; }
用法:[ClassXYZ setSkipFlag:YES];
用于静态空隙convert_uri_to_file_name(struct mg_connection *conn, const char *uri, 夏亚*布夫,size_t buf_len)
奥马尔,你对它的使用地点有很好的看法。事实证明,例如,如果我使用ClassXYZ自己的实例方法,它可以正常工作。
通常,主线程的自动释放池将在main
函数的第一行创建。在函数之前运行的任何内容main
都会看到自动释放池不存在。
+load
函数是导致泄漏的原因之一,因为它在函数main
之前运行。如果是这种情况,请考虑改用+initialize
。
只是出于好奇,如果你把函数调用放在一个@autorelease
日志应该消失