ARC:如何发布静态变量?

ma1*_*w28 10 objective-c static-variables automatic-ref-counting

Will 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
Run Code Online (Sandbox Code Playgroud)

ma1*_*w28 20

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

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

资源

根据第4.4.3.模板参数的的上的Objective-C自动参考LLVM文档计数(ARC),"如果一个模板类型参数的模板的说法是,没有一个明确的所有权限定符的保留性对象所有者类型,将其调整为具有__strong资格."

并且,根据第4.2.语义,"对于__strong对象,首先保留新的指针;其次,左值加载原始语义;第三,新的指针被存储到具有原始语义的左值;最后,旧的指针被释放.这不被执行.原子地;必须使用外部同步,以便在并发加载和存储时使其安全.