Iphone Cocoa-Singleton对象:在哪里初始化成员变量?

Iphone Cocoa-Singleton对象:在哪里初始化成员变量?,iphone,cocoa,singleton,initialization,Iphone,Cocoa,Singleton,Initialization,我想知道初始化singleton类成员的最佳位置在哪里 我正在使用Apple Basic guide单例实现。你能精确地指出是哪一行发生的吗?代码如下: static MyGizmoClass *sharedGizmoManager = nil; + (MyGizmoClass*)sharedManager { @synchronized(self) { if (sharedGizmoManager == nil) { [[self alloc]

我想知道初始化singleton类成员的最佳位置在哪里

我正在使用Apple Basic guide单例实现。你能精确地指出是哪一行发生的吗?代码如下:

static MyGizmoClass *sharedGizmoManager = nil;

+ (MyGizmoClass*)sharedManager
{
    @synchronized(self) {
        if (sharedGizmoManager == nil) {
            [[self alloc] init]; // assignment not done here
        }
    }
    return sharedGizmoManager;
}

+ (id)allocWithZone:(NSZone *)zone
{
    @synchronized(self) {
        if (sharedGizmoManager == nil) {
            sharedGizmoManager = [super allocWithZone:zone];
            return sharedGizmoManager;  // assignment and return on first allocation
        }
    }
    return nil; //on subsequent allocation attempts return nil
}

- (id)copyWithZone:(NSZone *)zone
{
    return self;
}

- (id)retain
{
    return self;
}

- (unsigned)retainCount
{
    return UINT_MAX;  //denotes an object that cannot be released
}

- (void)release
{
    //do nothing
}

- (id)autorelease
{
    return self;
}

与普通类一样-在块上方添加以下内容:

-(id)init {
  if (self = [super init]) {
     // do init here
  }

  return self;
}

第一次访问singleton时将调用它。

您可以像其他任何类一样,在init方法中初始化它们


但是,请注意,如果您的singleton包含成员国,它可能不再是线程安全的。由于可以随时访问应用程序中的任何位置的单例,因此可以从不同的线程访问它。

如果我创建了init方法,那么它可以直接访问,而无需通过sharedManager,对吗?现在,如果我将它设置为私有,这不会超出init()方法的范围,对吗?是的,它可以直接访问,但我认为它不应该是私有的-singleton将确保它在第一次需要时被调用。您只需像往常一样调用[[MySingletonClass sharedClass]message]。+1,正如Jon Hess所指出的,您通常不应该重载所有这些方法,除非您确实必须确保此对象只有一个实例。这在实践中非常罕见。一般来说,您只想使访问共享实例变得容易,为此,您只需要实现一个返回静态实例的+sharedInstance(或+sharedManager,或其他)方法,而不必担心调用方是否显式请求一个唯一的实例。苹果开发人员如何使用他们自己的单例?必须有一种方法来阻止用户访问init()方法。好的,你必须阅读Jon Hess在这个页面上发表的文章,它基本上解释了这一切。你可能想阅读。您真的想要一个覆盖版本的单例吗?这只是掩盖了漏洞。在你提醒Jon Hess你在关注苹果文档之前:我写这篇帖子是专门针对苹果文档的。另外值得注意的是,类没有任何类型的“成员”。最接近的是类的实现文件中的静态变量。而且类成员不是您想要初始化的对象。你想说的是singleton实例的实例变量。看这个,正确的术语应该是:“我应该把singleton类的成员变量的初始化代码放在哪里?”。然后,一旦singleton类被实例化至少一次,它们就成为singleton实例的实例变量!?!!?辩论