Objective C具有类层次结构的Singleton

时间:2012-11-09 17:09:33

标签: objective-c class inheritance singleton hierarchy

我有一个班级家长和一个班级孩子。孩子来自父母。我只实例化Child类,父项永远不会直接初始化,只能由子项初始化。 我至少需要父母成为单身人士。如果这不起作用,儿童单身也是可以的。 我尝试了以下但是没有将其改为单身:

static MySingleton *sharedSingleton;

+ (void)initialize
{
    static BOOL initialized = NO;
    if(!initialized)
    {
        initialized = YES;
        sharedSingleton = [[MySingleton alloc] init];
    }
}

Child类调用[super init]来实例化Parent。你能帮帮我吗?

编辑:我为我的解决方案(架构)添加了一些背景信息:我有一个Web服务客户端,它与Web服务有连接。我有一个基类(Parent),它有关于连接的信息(经过身份验证,如何连接等),我有不同的子类派生自这个基类。对不同子类的需求是一个子项负责一组Web服务逻辑,另一个子项负责另一组Web服务逻辑。问题是,我希望连接信息是单例(因为它们都只使用一个连接,而不是很多)。

5 个答案:

答案 0 :(得分:1)

更安全的选项可能是:

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

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

答案 1 :(得分:0)

把这行静态BOOL初始化= NO;下面这行静态MySingleton * sharedSingleton;像这样

static MySingleton *sharedSingleton;
static BOOL initialized = NO;
+ (void)initialize
{
  if(!initialized)
  {
     initialized = YES;
     sharedSingleton = [[MySingleton alloc] init];
  }
}
希望有所帮助!

答案 2 :(得分:0)

通常的模式是:

static MySuperclass *singleton = nil;
+ (void)initialize {
    if (self == [MySuperclass class]) {
        singleton = [[MySubclassProbabl alloc] init];
    }
}

答案 3 :(得分:0)

与其他答案略有不同,这是创建单身人士的现代方式

static MySingleton * volatile sharedInstance = nil;

+(MySingleton*) sharedInstance {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MySingleton alloc] init];
    });

    return sharedInstance;
}

此外,根据您的问题的措辞和单身人士的预期用途(与父母/子女的关系),我会说您必须重新考虑您的架构。

答案 4 :(得分:0)

如果我理解你正确的问题是没有意义的,那么你似乎会将关系继承混淆。如果你有:

@interface Parent : NSObject ...
@interface Child : Parent

然后你创建的每个 Child也是 Parent,不可分割地成为其自身的一部分,没有办法分割{{来自Parent的1}} - 你有一个对象。使用继承不会为您提供具有单个共享父级的多个子级。

如果您希望许多孩子分享单亲,那么您需要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]; 成为单例类(只有一个实例)或共享实例类(一个共享实例,其他实例可能)。

对于继承而言,与关系相反,从一个真正的单例类派生是很困难的(但并非不可能;-))如果你这样做,派生类本身就是一个单例。

您可以从共享实例类派生;你可以编写这个类(很难再次),这样你就可以拥有一个且只有一个实例,它不是派生类实例的一部分。

注意:到目前为止,其他答案都为您提供了生成共享实例类的代码,真正的单例类更加复杂(您可以找到)

表示,Apple的文档中的代码通常是共享的实例类。

HTH和我没有完全误解你的问题!