我创建了一个单例类,而这里是代码
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类创建不同的对象。
答案 0 :(得分:-1)
首先:单例是一个类,您可以创建一个且只能创建一个实例对象。这是通常的定义,它是Apple使用的定义。但是,有趣的是,在同一文档中,示例包含的情况,其中此规则不已实现。 (例如,NSFileManager IIRC。)因此,在Apple看来,即使存在差异,共享实例和单例之间也没有太大差异。 (共享实例是“特殊情况”,单身人士是寂寞的牛仔。)
所以 - 也许 - 采用这种“共享实例就是单身,即使它们不是”反模式也足够了。我不会这样做。但是当他找到一个名为+ sharedInstance的方法时,可能没有人会想到+ alloc。所以 - 也许 - 这没什么大不了的。
虽然使用手动RC非常容易采用单例模式,但使用自动RC变得有点困难。我认为最简单的方法是在-init中返回sharedInstance ...如评论中所述。 -init ...方法是所有权消耗和所有权转移。 (这在Apple的文档中没有提及。你应该总是阅读这个主题的clang文档。到目前为止它们更好。)因此+ alloc传递的旧实例将被消耗并移走。 / p>