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 时,ivars 也会如此。

于 2012-10-29T10:56:19.847 回答