我有一个单例并且想要创建内部标志变量,它应该表明单例是“已释放”的,当我获得单例实例时,它应该重新初始化。
对于这种情况,我决定使用静态变量
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;
}
我对这种情况的理解可能有误,请为我澄清一下。
答案 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
}