是否在Objective-C / ARC中的dealloc上发布了局部静态变量?

时间:2012-10-29 10:21:31

标签: objective-c memory-management static automatic-ref-counting

我有一个处理单身人士的工厂如下

@implementation MyFactory

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

@end

当MyFactory实例被解除分配时,是否释放了这些静态局部变量?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

如@trojanfoe所述,答案是否定的,可能是因为编译器为静态var分配了一个永久空间并且也是一个局部var,只有方法本身才能访问它,从而能够解除它(通过= nil)。

另一种策略是假设你的工厂是实例对象而不是静态类:

@implementation MyFactory
{
    AudioEngine *_audioEngine;
}

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

    return _audioEngine;
}

@end

当您的MyFactory实例dealloc与ivars一样时。