我有一个类Parent和一个类Child。子代派生自父代。我只实例化了child类,父类从不直接初始化,只由子类初始化。我至少需要父母都是独生子女。如果这不起作用,那么Child是一个独生子女也没问题。我尝试了以下方法,但没有将其更改为单例:
static MySingleton *sharedSingleton;
+ (void)initialize
{
static BOOL initialized = NO;
if(!initialized)
{
initialized = YES;
sharedSingleton = [[MySingleton alloc] init];
}
}Child类调用super来实例化父对象。你能帮我一下吗?
编辑:我为我的解决方案(架构)添加了一些背景信息:我有一个web服务客户端,它连接到一个web服务。我有一个基类(Parent),它包含有关连接的信息(已验证、如何连接等),并且我有从这个基类派生的不同子类。需要不同的子类,一个子类负责一组web服务逻辑,另一个子类负责另一组web服务逻辑。问题是,我希望连接信息是单例的(因为它们都只使用一个连接,而不是多个)。
发布于 2012-11-10 02:19:39
如果我没理解错的话,你的要求是没有意义的,你似乎混淆了继承的关系。如果您有:
@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和我还没有完全误解你的问题!
发布于 2012-11-10 01:29:06
更安全的线程选项应该是这样的:
+(MySingleton *)singleton {
static dispatch_once_t pred;
static MySingleton *shared = nil;
dispatch_once(&pred, ^{
shared = [[MySingleton alloc] init];
});
return shared;
}发布于 2012-11-10 01:13:31
将此行static BOOL initialized = NO;放在此行static MySingleton *sharedSingleton;下面,如下所示
static MySingleton *sharedSingleton;
static BOOL initialized = NO;
+ (void)initialize
{
if(!initialized)
{
initialized = YES;
sharedSingleton = [[MySingleton alloc] init];
}
}希望这能有所帮助!
https://stackoverflow.com/questions/13312700
复制相似问题