[英]Objective C Singleton with class hierarchies
我有一班父母,一班孩子。 孩子来自父母。 我只实例化Child类,父级永远不会直接由子级直接初始化。 我至少需要父母才能成为单身人士。 如果那不起作用,则Child作为单身人士也可以。 我尝试了以下操作,但是并没有将其更改为单例:
static MySingleton *sharedSingleton;
+ (void)initialize
{
static BOOL initialized = NO;
if(!initialized)
{
initialized = YES;
sharedSingleton = [[MySingleton alloc] init];
}
}
Child类调用[super init]实例化Parent。 你能在这里帮我吗?
编辑:我为我的解决方案(体系结构)添加一些背景信息:我有一个Web服务客户端,该客户端具有与Web服务的连接。 我有一个基类(父类),它具有有关连接的信息(经过身份验证,如何连接等),并且我有从该基类派生的不同子类。 对不同子类的需求是,一个子类负责一组Web服务逻辑,而另一个子类负责另一组Web服务逻辑。 问题是,我希望连接信息是单例的(因为它们都只使用一个连接,所以不多)。
一个更线程安全的选项将类似于:
+(MySingleton *)singleton {
static dispatch_once_t pred;
static MySingleton *shared = nil;
dispatch_once(&pred, ^{
shared = [[MySingleton alloc] init];
});
return shared;
}
把这行静态BOOL初始化= NO; 在此行下方,静态MySingleton * sharedSingleton; 像这样
static MySingleton *sharedSingleton;
static BOOL initialized = NO;
+ (void)initialize
{
if(!initialized)
{
initialized = YES;
sharedSingleton = [[MySingleton alloc] init];
}
}
希望有帮助!
通常的模式是:
static MySuperclass *singleton = nil;
+ (void)initialize {
if (self == [MySuperclass class]) {
singleton = [[MySubclassProbabl alloc] init];
}
}
与其他答案有些不同,这是创建单例的现代方法
static MySingleton * volatile sharedInstance = nil;
+(MySingleton*) sharedInstance {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[MySingleton alloc] init];
});
return sharedInstance;
}
同样,通过问题的措辞和单例的预期用途(具有父子关系),我想说您必须重新考虑您的体系结构。
如果我没有你的要求是没有意义的理解你,你似乎是具有继承 关系的混乱。 如果你有:
@interface Parent : NSObject ...
@interface Child : Parent
然后,您创建的每个 Child
也都是 Parent
,它本身也是不可分割的一部分,无法将Parent
对象与Child
对象分开-您只有一个对象。 使用继承不会使您的多个孩子有一个共享的父母。
如果您希望许多孩子共享一个单亲,那么您需要让Child
类拥有一个 Parent
。 例如:
@interface Parent : NSObject ...
@interface Child : NSObject
@property (readonly) Parent *myParent;
- (id) initAsChildOf:(Parent *)parent;
...
@end
用作:
Parent *theParent = [Parent new];
Child *firstChild = [[Child alloc] initAsChildOf:theParent];
Child *secondChild = [[Child alloc] initAsChildOf:theParent];
如果愿意,可以使Parent
为单例类(只能有一个实例),也可以使共享实例类(有一个共享实例,可以有其他实例)。
对于继承,与关系相反,很难(但并非不可能; ;-))从真正的单例类派生,如果这样做,派生类本身就是一个单例。
您可以从共享实例类派生。 您可以编写该类(再次编写),以便您可以拥有一个实例,并且该实例不是派生类实例不可分割的一部分。
注意:到目前为止,其他所有答案都为您提供了生成共享实例类的代码, 真正的单例类要复杂得多(您可以在Apple文档中找到代码),并且共享实例类通常就足够了。
HTH和我还没有完全误解了您的问题!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.