ARC:如何释放静态变量



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

// 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

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

这意味着通过在dealloc中设置exampleStringnil,您保留了nil(新值),它不做任何事情,并释放旧值。

根据4.4.3节。LLVM文档中关于Objective-C自动引用计数(ARC)的模板参数,"如果模板类型参数的模板参数是一个可保留的对象所有者类型,没有明确的所有权限定符,它将被调整为具有__strong限定符。"

和,根据第4.2节。语义:"对于__strong对象,新指针首先被保留;第二,左值加载了原始语义;第三,用原始语义将新指针存储到左值中;最后,旧的指针被释放。这不是自动执行的;在面对并发加载和存储时,必须使用外部同步来保证安全。

最新更新