任何人都可以解释为什么MyCLController类的单例实例用于示例iphone应用程序LocateMe找到的here
以及retain,retainCount,release和autorelease的覆盖?任何帮助将非常感谢!!
答案 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。如果有的话,代码应该是灾难性的失败。同样,在许多情况下,单例类也可能对单个实例有效。