对于使用ARC的iOS 5.0,这是我想要实现的东西,需要指导如何才能做到最好。我有一些全局设置来确定对象树中每个对象的状态。我需要这只是所有对象及其子项共享的一个实例,以便在更改设置时,这些对象的行为也会发生变化......为了清楚起见,它就像这样......
Global Settings (current language)
|(should affect)
----------------------------
| |
GenericParent1 GenericParent2
| |
------------
| |
ChildType1 ChildType2
答案 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的实施效果更佳。