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
答案 0 :(得分:20)
是的,因为您没有指定所有权限定符,LLVM编译器会推断exampleString
拥有__strong
所有权限定条件。
这意味着,通过在exampleString
中将nil
设置为dealloc
,您将保留nil
(新值),它不执行任何操作,并释放旧值。
根据4.4.3. Template arguments的LLVM documentation on Objective-C Automatic Reference Counting (ARC)部分,“如果模板类型参数的模板参数是不具有显式所有权限定符的可保留对象所有者类型,则将其调整为{ {1}}资格。“
并且,根据4.2. Semantics部分,“对于__strong
个对象,首先保留新的指针;第二个,使用原始语义加载左值;第三,将新的指针存储到左值中使用原始语义;最后,释放旧的指针。这不是原子地执行的;必须使用外部同步来使其在并发加载和存储时安全。