单例中的静态变量

时间:2012-06-21 18:49:07

标签: objective-c ios variables static singleton

我有一个单例并且想要创建内部标志变量,它应该表明单例是“已释放”的,当我获得单例实例时,它应该重新初始化。

对于这种情况,我决定使用静态变量

static BOOL wasReleased = NO; 

并在destroy函数中将其设置为“YES”:

- (void)destroy
{
    wasReleased = YES;
    ...release internal singleton resources...
}

但是当我尝试获取单例实例时,此变量值始终为“NO”,因此内部资源在发布后永远不会重新初始化:

+ (MySingleton *)sharedInstance
{
    if (sharedCoordinator == nil)
    {
        sharedCoordinator = [[super alloc] init];
        [sharedCoordinator initialize];
    }

    if (wasReleased) 
    {
        [sharedCoordinator initialize];
    }

    return sharedCoordinator;
}

我对这种情况的理解可能有误,请为我澄清一下。

3 个答案:

答案 0 :(得分:1)

删除静态wasReleased实例变量并使其成为MySingleton类的属性(不要忘记合成它)

@property (nonatomic, assign) BOOL wasReleased;

然后在-destroy方法中:

- (void)destroy
{
    self.wasReleased = YES;
    //...release internal singleton resources...
}

然后(删除你的静态ivar sharedCoordinator - 我想你有一个)

+ (MySingleton *)sharedInstance
{
    static MySingleton *sharedCoordinator = nil;
    if (!sharedCoordinator)
    {
        sharedCoordinator = [[MySingleton alloc] init];
        [sharedCoordinator initialize];
    }

    if (sharedCoordinator.wasReleased) 
    {
        [sharedCoordinator initialize];
        sharedCoordinator.wasReleased = NO; //If you are not doing it in the -initialize method
    }

    return sharedCoordinator;
}

答案 1 :(得分:1)

  

我对这种情况的理解可能有误,请澄清一下   我

为什么你首先使用单身人士?单身人员永远不需要被释放或重新初始化。如果你需要做这些事情,你很可能只需要在你需要的时候创建一个新的类实例。

此外,避免使用-initialize作为实例方法名称是个好主意,因为这很容易与每个类所具有的类方法+initialize混淆。

答案 2 :(得分:0)

这并不能解决您的直接问题,但您应该重新考虑您的设计。摧毁单身人士并不是一个好主意。如果你试图释放大量资源(图像,视频等),你可以让单身人士的实际方法负责重新实例化。

以下内容无法按预期工作:

- (id)initSomeClassUsingTheSingleton
{
  mySingletonVariable = [MySingleton sharedInstance];
}

- (void)someOtherFunctionOccuringAfterDestroy
{
  [mySingletonVariable aMethodOnTheSingleton];
}

这是使用单身人士的完全有效的方法,但在你的情况下你不能这样做。相反,你的单身人士应该有以下方法:

- (void)aMethodOnTheSingleton
{
  //if resources for method not allocated
    // .. allocate

  // do the rest
}