0

我有一个类 Parent 和一个类 Child。Child 派生自 Parent。我只实例化 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 服务逻辑。问题是,我希望连接信息是单例的(因为它们都只使用一个连接,而不是很多)。

4

5 回答 5

1

一个更线程安全的选项是这样的:

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

    dispatch_once(&pred, ^{
        shared = [[MySingleton alloc] init];
    });
    return shared;
}
于 2012-11-09T17:29:06.440 回答
0

把这一行 static BOOL initialized = NO; 在这条线下面静态 MySingleton *sharedSingleton; 像这样

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

希望有帮助!

于 2012-11-09T17:13:31.233 回答
0

通常的模式是:

static MySuperclass *singleton = nil;
+ (void)initialize {
    if (self == [MySuperclass class]) {
        singleton = [[MySubclassProbabl alloc] init];
    }
}
于 2012-11-09T17:16:05.140 回答
0

与其他答案有点不同,这是创建单例的现代方式

static MySingleton * volatile sharedInstance = nil;

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

    return sharedInstance;
}

此外,通过您的问题的措辞和单例的预期用途(具有父/子关系),我想说您必须重新考虑您的架构。

于 2012-11-09T17:29:56.937 回答
0

如果我正确理解您的要求,那么您的要求没有意义,那么您似乎将关系继承混淆了。如果你有:

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

那么你创造的 一个也是它自身不可分割的一部分,没有办法从中分离——你只有一个对象。使用继承不会为您提供具有单个共享父级的多个子级。Child ParentParentChild

如果您希望许多孩子共享一个单亲,那么您需要您的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-09T18:19:39.060 回答