在我的项目中的一个第三方库中,单例sharedInstance方法似乎在最终的return_sharedInstance行中抛出了一个分析器警告:
+ (BlockBackground*)sharedInstance
{
if (_sharedInstance != nil) {
return _sharedInstance;
}
@synchronized(self) {
if (_sharedInstance == nil) {
[[[self alloc] init] autorelease];
}
}
return _sharedInstance;
}
无论如何,实际修复此警告的正确方法是什么?另外我已经看到你不应该在这样的方法中做自我分配,这是真的吗?
谢谢!
答案 0 :(得分:5)
实际上你的行[[[self alloc] init] autorelease];
在对象上创建并立即扔掉它。您需要替换为_sharedInstance = [[self alloc] init];
答案 1 :(得分:2)
这是autorelease
;你需要删除它,但更重要的是(感谢@ Yaman / @ rmaddy)你没有将分配的对象分配给_sharedInstance
。
下一次运行循环结束时,或下次自动释放池被销毁时,以较早者为准,实例将被释放。 _sharedInstance
指针将保留悬空,对象的下一个用户将发送消息发送到解除分配的实例(或某些此类)。