繁体   English   中英

具有类层次结构的Objective C Singleton

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM