ARC:如何发布静态变量?

时间:2011-10-29 22:18:54

标签: objective-c automatic-ref-counting static-variables

dealloc(下方)会释放静态变量NSString指向的exampleString吗?

// ExampleClass.h

@interface ExampleClass : NSObject

@end

// ExampleClass.m

static NSString *exampleString;

@implementation ExampleClass

- (void)dealloc {
    exampleString = nil;
}

- (id)init {
    self = [super init];
    if (self) {
        exampleString = [NSString stringWithFormat:@"example %@", @"format"];
    }
    return self;
}

@end

1 个答案:

答案 0 :(得分:20)

是的,因为您没有指定所有权限定符,LLVM编译器会推断exampleString拥有__strong所有权限定条件。

这意味着,通过在exampleString中将nil设置为dealloc,您将保留nil(新值),它不执行任何操作,并释放旧值。

资源

根据4.4.3. Template argumentsLLVM documentation on Objective-C Automatic Reference Counting (ARC)部分,“如果模板类型参数的模板参数是不具有显式所有权限定符的可保留对象所有者类型,则将其调整为{ {1}}资格。“

并且,根据4.2. Semantics部分,“对于__strong个对象,首先保留新的指针;第二个,使用原始语义加载左值;第三,将新的指针存储到左值中使用原始语义;最后,释放旧的指针。这不是原子地执行的;必须使用外部同步来使其在并发加载和存储时安全。