我有一个班级家长和一个班级孩子。孩子来自父母。我只实例化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服务逻辑。问题是,我希望连接信息是单例(因为它们都只使用一个连接,而不是很多)。
答案 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和我没有完全误解你的问题!