0

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

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

        return instanceOfGameKitHelper;
    }

    return nil;
}

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

无论如何,我将如何正确解决这个问题?

谢谢!

4

2 回答 2

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 的方法。当然,即使这样,您仍然在分配变量并且永远不会释放它,因为它仍然是单例。

于 2012-11-20T04:44:13.073 回答
2

一种更现代的设置单例的方法是这样的:

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

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

    return instance;
}
于 2012-11-20T04:51:51.773 回答