2

私は次のようにシングルトンを扱う工場を持っています

@implementation MyFactory

- (AudioEngine *)theAudioEngine 
{
    static AudioEngine *ae = nil;
    if (ae == nil) {
        ae = [[AudioEngine] alloc] init];
    }
    return ae;
}

@end

MyFactoryインスタンスのロックが解除されると、そのような静的ローカル変数は解放されますか?

4

2 に答える 2

3

いいえ、リリースされていません。ただし、変数をヒープに移動し、それを解放するためのクラスメソッドを設定することもできます。これは、アプリレベルのクローズダウンメソッドから呼び出されます。

static AudioEngine *_ae = nil;

@implementation MyFactory

- (AudioEngine *)theAudioEngine 
{
    if (_ae == nil) {
        _ae = [[AudioEngine] alloc] init];
    }
    return _ae;
}

+ (void)cleanup
{
    if (_ae != nil)
    {
        // No need to release when in ARC mode (thanks to @AndrewMadsen)
        //[_ae release];
        _ae = nil;
    }
}

@end
于 2012-10-29T10:25:48.590 に答える
1

@trojanfoeが述べているように、答えはノーです。おそらく、コンパイラが静的変数に永続的なスペースを割り当て、ローカル変数でもあるため、メソッド自体だけがそれにアクセスできるため、(を介して= nil)割り当てを解除することができます。

ファクトリを想定して機能する別の戦略は、静的クラスではなくインスタンスオブジェクトです。

@implementation MyFactory
{
    AudioEngine *_audioEngine;
}

- (AudioEngine *)audioEngineSingleton
{
    if (_audioEngine == nil) {
        _audioEngine = [[AudioEngine alloc] init];
    }

    return _audioEngine;
}

@end

MyFactoryインスタンスがdeallocになると、ivarも同様になります。

于 2012-10-29T10:56:19.847 に答える