多个对象的全局对象设置

时间:2012-03-23 02:27:53

标签: ios

对于使用ARC的iOS 5.0,这是我想要实现的东西,需要指导如何才能做到最好。我有一些全局设置来确定对象树中每个对象的状态。我需要这只是所有对象及其子项共享的一个实例,以便在更改设置时,这些对象的行为也会发生变化......为了清楚起见,它就像这样......

                       Global Settings (current language)
                               |(should affect)
                    ---------------------------- 
                    |                          |
                 GenericParent1            GenericParent2
                    |                          |
              ------------
              |          |
          ChildType1    ChildType2

2 个答案:

答案 0 :(得分:1)

虽然borrden的回答是正确的,(如果你想确保只有一个实例运行,则使用单例),实现应该是这样的:

+(MyClass *)singleton {
 static dispatch_once_t pred;
 static MyClass *shared = nil;

 dispatch_once(&pred, ^{
  shared = [[MyClass alloc] init];
 });
 return shared;
}

这样你就可以利用盛大的中央调度。

您可以在此处详细了解:http://cocoasamurai.blogspot.jp/2011/04/singletons-your-doing-them-wrong.html

编辑:

使用静态实现,你的意思是全局变量吗?如果我理解正确,您希望“共享”来自同一父级的2个或更多实例之间的状态。但是,每个实例都有自己的局部变量和那些继承的局部变量,但仍然是继承的局部变量特定于THAT实例。如果要在这些对象之间共享状态,则需要全局通信。例如,如果要在两个实例之间共享一个对象,则必须使其指针指向同一个对象,然后您可以读取该对象中保存的“状态”,如果您从一个地方更改它将更改它从另一个。这样做的问题是你不能确保你只有一个该对象的实例。您甚至可能错误地创建了多个并且在您的方法上访问不同的一个。这就是单身人士解决的问题,即使你尝试创建一个新的,你也会得到原始的。

或者,您可以拥有一个全局变量并通过它共享信息。但是这种方法看起来并不是很好,因为它有时会使你的代码难以理解。

答案 1 :(得分:0)

对于这种模式,我推荐一个单身人士。而不是每次都分配/启动全局设置,而是通过静态方法检索它们,如下所示:

static GlobalSettings kGlobalSettings;

//...

+ (GlobalSettings *)sharedSettings
{
    if(!kGlobalSettings)
        kGlobalSettings = [[GlobalSettings alloc] init];

    return kGlobalSettings;
}

然后当您需要时,只需致电GlobalSettings *settings = [GlobalSettings sharedSettings];

编辑:此方法已过时且已过时...... Luis的实施效果更佳。