2012-11-09 24 views
0

我有一个Parent类和一个类Child。孩子来自父母。我只实例化Child类,但父类不会直接初始化,只能由子类初始化。 我至少需要父母是一个单身人士。如果这不起作用,孩子也是单身人士也可以。 我尝试以下,但没有将其更改为单:Objective C具有类层次结构的单身人士

static MySingleton *sharedSingleton; 

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

子类中调用[超级的init]实例化父。你能帮我吗?

编辑:我为我的解决方案(体系结构)添加一些背景信息:我有一个Web服务客户端,它具有到Web服务的连接。我有一个基类(Parent),它具有关于连接的信息(经过身份验证,如何连接等),并且具有不同的从此基类派生的子类。对不同子类的需求是,一个孩子负责一组Web服务逻辑,另一个孩子负责另一组Web服务逻辑。问题是,我想连接信息是单身人士(因为他们都只使用一个连接,而不是很多)。

+0

'initialized'变量是多余的,为什么不检查if(sharedSingleton == nil)'? – 2012-11-09 17:12:58

+0

也许你可以简单地解释你想达到的目标,因为父母是一个单身人士,而从它身上衍生出来的孩子对我来说看起来并不麻烦。也许有更好的解决方案? – Anton

回答

0

如果我正确你的要求是没有意义的理解你,你似乎是混乱关系继承。如果您有:

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

然后Child创建是一个Parent为好,不可分割自身的一部分,没有办法分裂从ChildParent - 你有一个单一的对象。使用继承不会为多个孩子提供单个共享父级。

如果你想要很多孩子分享一个单亲,那么你需要你的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一个单独的类(只有一个实例可能),或共享实例类(一个共享实例,其他情况下可能)。

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

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

注:其他答案至今都为您提供了代码产生共享实例类,一真正的单例类是一个涉及多一点(你可以找到苹果的文档中的代码),往往一共享实例类就足够了。

HTH和我一直没有误解你的问题!

+0

thx,你可以添加解释一个真正的单身人士和共享实例之间的区别吗?我在苹果的文档中找不到任何有用的东西(有时文档太旧了)。我在我的问题中添加了一些背景信息。你会推荐什么? – tester

+0

一个_true singleton_是一个类最多只能有一个实例;在Objective-C中创建一个通常涉及重写'allocWithZone'和/或'init'来确保创建实例的任何尝试都会返回_same_唯一实例。一个_shared实例_类只是一个带有众所周知的实例的类,它很容易获得,通常使用一个类方法,比如'sharedInstance';该类的其他实例可能存在。许多可可课程遵循后面的模型,例如'NSFileManager'及其'defaultManager'。 – CRD

+0

我实际上发现,如果我用dispatch_once_t逻辑使用单例代码,我不能使用allocWithZone。仅供参考。那么我该如何防止某人在我的单身人士上使用alloc? – tester

0

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

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

希望有帮助!

0

这个通常的模式是:

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

更线程安全的选择是这样的:

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

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

一点从其他的答案不同,这是创建现代的方式一个单身人士

static MySingleton * volatile sharedInstance = nil; 

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

    return sharedInstance; 
} 

另外,通过你的问题的措辞和单身人士的用途(与父母/孩子的关系),我想说你必须重新考虑你的架构。