在方法调用中设置static(使用单例模式)

时间:2012-02-09 11:14:18

标签: objective-c cocoa

是smth。像这样合法吗?它编译并且看起来运行正常,但它可以吗? (目标是在我的方法中将自己设置为零)

我的意思是我在一个方法中将自己静态设置为nil

static MyClass * StaticInstance = nil;

+ (MyClass *) sharedStaticInstance 
{
    if (StaticInstance == nil) {
        StaticInstance = [[MyClass alloc] init];
    }

    return StaticInstance;
}

- (void) killStaticSelf
{
    StaticInstance = nil;
}

以后

[[MyClass sharedStaticInstance] doSmth]; // our static instance is created
[[MyClass sharedStaticInstance] killStaticSelf]; // now its killed inside itself method
[[MyClass sharedStaticInstance] doSmth]; // now it should recreate again

4 个答案:

答案 0 :(得分:2)

它有内存泄漏。 您应首先取消StaticInstance,然后再将nil分配给它。

答案 1 :(得分:1)

是的,这就是它的完成方式。我经常使用sharedStaticInstance,虽然我通常不会创建析构函数,但这可能是一个好主意,只要对此类中的共享实例的所有引用都首先通过sharedStaticInstance

编辑:我刚注意到killStaticSelf是一个实例方法 - 它应该是我认为的类方法,但不管怎样都不应该有任何问题。

[MyClass killStaticSelf];

即使函数堆栈关闭,因为将消息发送到nil不会导致Objective-C出现问题。

答案 2 :(得分:1)

您的sharedInstance方法不是线程安全的,因此您可以在此代码中获得竞争条件:

if (StaticInstance == nil) {
    StaticInstance = [[MyClass alloc] init];
}

- (void) killStaticSelf
{
    StaticInstance = nil;
}

上面的代码有泄漏,因为您没有提供StaticInstance作为保留属性(显然)。您可以将单例代码包装在属性中,但使用相同的静态实例。

答案 3 :(得分:0)

这是合法的,但你需要在将变量设置为nil之前释放变量,以避免在不使用ARC时发生内存泄漏。

虽然对这种单身使用逻辑的理解超出了我不起眼的大脑能力。