首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有类层次的Objective C Singleton

具有类层次的Objective C Singleton
EN

Stack Overflow用户
提问于 2012-11-10 01:09:33
回答 5查看 1.1K关注 0票数 0

我有一个类Parent和一个类Child。子代派生自父代。我只实例化了child类,父类从不直接初始化,只由子类初始化。我至少需要父母都是独生子女。如果这不起作用,那么Child是一个独生子女也没问题。我尝试了以下方法,但没有将其更改为单例:

代码语言:javascript
复制
static MySingleton *sharedSingleton;

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

Child类调用super来实例化父对象。你能帮我一下吗?

编辑:我为我的解决方案(架构)添加了一些背景信息:我有一个web服务客户端,它连接到一个web服务。我有一个基类(Parent),它包含有关连接的信息(已验证、如何连接等),并且我有从这个基类派生的不同子类。需要不同的子类,一个子类负责一组web服务逻辑,另一个子类负责另一组web服务逻辑。问题是,我希望连接信息是单例的(因为它们都只使用一个连接,而不是多个)。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2012-11-10 02:19:39

如果我没理解错的话,你的要求是没有意义的,你似乎混淆了继承的关系。如果您有:

代码语言:javascript
复制
@interface Parent : NSObject ...
@interface Child : Parent

那么你创建的每个Child也是一个Parent,是它自身不可分的一部分,没有办法将ParentChild中分离出来--你只有一个对象。使用继承不会为您提供具有单个共享父项的多个子项。

如果您希望多个子类共享一个父类,那么您的Child类就需要有一个Parent。例如:

代码语言:javascript
复制
@interface Parent : NSObject ...

@interface Child : NSObject

@property (readonly) Parent *myParent;

- (id) initAsChildOf:(Parent *)parent;

...

@end

用作:

代码语言:javascript
复制
Parent *theParent = [Parent new];
Child *firstChild = [[Child alloc] initAsChildOf:theParent];
Child *secondChild = [[Child alloc] initAsChildOf:theParent];

如果你愿意,你可以让Parent成为一个单独的类(只能有一个实例),或者是一个共享的实例类(一个共享的实例,其他可能的实例)。

对于继承,而不是关系,很难(但不是不可能;-))从真正的单例类派生,如果这样做,派生类本身就是单例类。

您可以从共享实例类派生;您可以编写类(再次硬写),以便您可以拥有且仅有一个实例,该实例不是派生类的实例的一部分。

注意:到目前为止,其他答案都提供了生成共享实例类的代码,真正的单例类稍微复杂一些(您可以在Apple的文档中找到代码),通常共享实例类就足够了。

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

票数 0
EN

Stack Overflow用户

发布于 2012-11-10 01:29:06

更安全的线程选项应该是这样的:

代码语言:javascript
复制
+(MySingleton *)singleton {
    static dispatch_once_t pred;
    static MySingleton *shared = nil;

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

Stack Overflow用户

发布于 2012-11-10 01:13:31

将此行static BOOL initialized = NO;放在此行static MySingleton *sharedSingleton;下面,如下所示

代码语言:javascript
复制
static MySingleton *sharedSingleton;
static BOOL initialized = NO;
+ (void)initialize
{
  if(!initialized)
  {
     initialized = YES;
     sharedSingleton = [[MySingleton alloc] init];
  }
}

希望这能有所帮助!

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13312700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档