2012-11-20 43 views
0

我已经下载了一个图书馆关闭github上,并已经注意到,在图书馆的主要单身有在该位的代码可能泄漏:Singleton设计潜在的泄漏

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

     return instanceOfGameKitHelper; 
    } 

    return nil; 
} 

现在很明显有没有发布或autorelease任何地方,所以我必须这样做,但如何以及以什么方式正确?我已经查看了Internet上的各种单例设计模式,并且他们只是将instanceOfGameKitHelper分配给alloc和init行。

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

谢谢!

回答

2

一个更现代的方法来设置单身是这样的:

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

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

    return instance; 
} 
+0

我喜欢它,简单而简洁,它使警告无声无息。加上它更容易阅读。 –

+0

@iBradApps正如在另一个答案中指出的那样,警告是因为您从未将对象分配给您的变量。 – rmaddy

+0

好吧,我明白,我upvoted两个答案BC他们都帮我解决了这个问题。 –

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

+0

有什么办法沉默警告此后,除非我的应用程序沉默的人? –

+0

@iBradApps是的,实际将分配的对象分配给'instanceOfGameKitHelper'变量。 – rmaddy

+0

是的,你发布的代码将不会工作。将'[[DDGameKitHelper alloc] init];'更改为'instanceOfGameKitHelper = [[DDGameKitHelper alloc] init];'。 – lnafziger