1

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

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 类创建不同的对象。

4

1 回答 1

-1

首先:单例是一个类,你可以创建一个并且只能创建一个实例对象。这是通常的定义,也是 Apple 使用的定义。但是,有趣的是,在同一个文档中,示例包含不满足此规则的案例。(即 NSFileManager IIRC。)因此,在 Apple 看来,即使存在差异,共享实例和单例之间也没有太大区别。(共享实例是“特殊实例”,单例是孤独的牛仔。)

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

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

于 2013-10-21T08:26:17.140 回答