1

在我项目中的一个第三方库中,单例 sharedInstance 方法似乎在最后的 return_sharedInstance 行上抛出了一个分析器警告:

+ (BlockBackground*)sharedInstance
{
    if (_sharedInstance != nil) {
        return _sharedInstance;
    }

    @synchronized(self) {
        if (_sharedInstance == nil) {
            [[[self alloc] init] autorelease];
        }
    }

    return _sharedInstance;
}

无论如何,实际修复此警告的正确方法是什么?我还看到你不应该在这样的方法中进行自我分配,这是真的吗?

谢谢!

4

2 回答 2

5

实际上,您的行在[[[self alloc] init] autorelease];对象上创建并立即将其丢弃。您需要替换为_sharedInstance = [[self alloc] init];

于 2013-02-03T19:47:19.170 回答
2

这是autorelease; 你需要删除它,但更重要的是(感谢@Yaman/@rmaddy)你没有将分配的对象分配给_sharedInstance.

会发生的是,下次运行循环结束时,或者下次自动释放池被销毁时,以较早者为准,实例将被释放。_sharedInstance指针将悬空并且对象的下一个用户将错误地发送到已释放实例(或某些此类)的消息。

于 2013-02-03T19:45:43.940 回答