LocateMe示例代码中的iphone单例实例

enn*_*ler 1 iphone singleton objective-c

任何人都可以解释为什么在这里找到的示例iphone应用程序LocateMe中使用MyCLController类的单例实例

以及保留,retainCount,release和autorelease的覆盖?任何帮助将非常感谢!!

bbu*_*bum 5

因为在应用程序中只需要一个MyCLController实例.

该示例中的单例实现是超级防御模式.它会覆盖所有其他方法,以防止您可能释放实例.

就个人而言,我从来没有经历过这样的箍(并且文档将来会被更改),而是更喜欢做一个死的简单+ sharedInstance方法:

+ sharedInstance
{
    static id sharedInstance = nil;
    if (!sharedInstance) {
        sharedInstance = [self alloc];
        sharedInstance = [sharedInstance init];
    }

    return sharedInstance;
}
Run Code Online (Sandbox Code Playgroud)

(1)是的,我故意打破了alloc/init.它允许-init方法中的任何内容调用+ sharedInstance而不会出现问题.

(2)不,这不涉及多线程.为此,我使用GCD的dispatch_once().在iPhone上,你需要一个稍微不同的模式.@synchronized()有效,但是开销很大.

我之所以发现超级防御模式令人不安的原因之一就是因为,坦率地说,如果你有一个单例类并且你通过过度释放导致它被解除分配,那么你的代码就会被破坏而且那种bug应该不会被遮盖了.如果有的话,代码应该是灾难性的失败.同样,在许多情况下,单例类也可能对单个实例有效.