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

时间:2009-09-21 16:03:14

标签: iphone objective-c singleton

任何人都可以解释为什么MyCLController类的单例实例用于示例iphone应用程序LocateMe找到的here

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

1 个答案:

答案 0 :(得分:5)

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

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

就个人而言,我从未经历过这样的箍(并且将来会更改文档),而是选择使用简单的+ simpleInstance方法:

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

    return sharedInstance;
}

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

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

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