我有一个处理单身人士的工厂如下
@implementation MyFactory
- (AudioEngine *)theAudioEngine
{
static AudioEngine *ae = nil;
if (ae == nil) {
ae = [[AudioEngine] alloc] init];
}
return ae;
}
@end
当MyFactory实例被解除分配时,是否释放了这些静态局部变量?
答案 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一样时。