我们应该为单例类创建多个对象吗?这对于单身设计模式来说是好的

时间:2013-10-21 07:17:43

标签: ios objective-c singleton

我创建了一个单例类,而这里是代码

static DPGameManager *sharedManager = nil;  
+ (DPGameManager *)sharedManager  
{  
    static dispatch_once_t singletonPredicate;  
    dispatch_once (&_singletonPredicate, ^(){  
             sharedManager = [[DPGameManager alloc]init];  
});  
return sharedManager;  
}

DPGameManager *m1 = [DPGameManager sharedManager];  
DPGameManager *m2 = [DPGameManager alloc]init];  
DPGameManager *m3 = [DPGameManager alloc]init];  

m1,m2,m3是三个不同的对象     但是我们不应该为单例类创建三个不同的对象     我们怎样才能做到这一点      或者是这样可以为Singleton类创建不同的对象。

1 个答案:

答案 0 :(得分:-1)

首先:单例是一个类,您可以创建一个且只能创建一个实例对象。这是通常的定义,它是Apple使用的定义。但是,有趣的是,在同一文档中,示例包含的情况,其中此规则已实现。 (例如,NSFileManager IIRC。)因此,在Apple看来,即使存在差异,共享实例和单例之间也没有太大差异。 (共享实例是“特殊情况”,单身人士是寂寞的牛仔。)

所以 - 也许 - 采用这种“共享实例就是单身,即使它们不是”反模式也足够了。我不会这样做。但是当他找到一个名为+ sharedInstance的方法时,可能没有人会想到+ alloc。所以 - 也许 - 这没什么大不了的。

虽然使用手动RC非常容易采用单例模式,但使用自动RC变得有点困难。我认为最简单的方法是在-init中返回sharedInstance ...如评论中所述。 -init ...方法是所有权消耗和所有权转移。 (这在Apple的文档中没有提及。你应该总是阅读这个主题的clang文档。到目前为止它们更好。)因此+ alloc传递的旧实例将被消耗并移走。 / p>