单身设计潜在泄漏

时间:2012-11-20 04:42:15

标签: ios singleton memory-leaks analyzer

我从github下载了一个库,并注意到在库的主要单例中,这段代码可能存在泄漏:

+(DDGameKitHelper*) sharedGameKitHelper
{
    @synchronized(self)
    {
        if (instanceOfGameKitHelper == nil)
        {
            [[DDGameKitHelper alloc] init];
        }

        return instanceOfGameKitHelper;
    }

    return nil;
}

现在显然在任何地方都没有发布或自动发布,所以我必须这样做,但是如何以及以何种方式正确?我已经在Internet上查看了各种Singleton设计模式,他们只是将instanceOfGameKitHelper分配给alloc和init行。

无论如何,我如何妥善解决这个问题?

谢谢!

2 个答案:

答案 0 :(得分:2)

根据定义,单例创建一次,永不释放。可以把它想象成一个全局变量。

请查看Apple的此文档:Cocoa Core Competencies - Singleton了解更多详情。

或者他们的例子(在页面底部):http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32

我通常使用@ rmaddy的方法。当然,即使这样,你仍然会分配变量并且永远不会释放变量,因为它仍然是单身。

答案 1 :(得分:2)

设置单身人士的更现代的方法是这样的:

+ (DDGameKitHelper *)sharedGameKitHelper {
    static DDGameKitHelper *instance = nil;
    static dispatch_once_t predicate;

    dispatch_once(&predicate, ^{ instance = [self new]; });

    return instance;
}