【问题标题】:ARC: How to release static variable?ARC:如何释放静态变量?
【发布时间】:2011-12-18 00:40:17
【问题描述】:

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

【问题讨论】:

  • 这是一个奇怪的例子。首先,您的代码中使用的static 并不表示存储持续时间,而是表示可见性(链接)。其次,看起来您要么想要类方法而不是实例方法,要么exampleString 应该是一个实例变量。你到底想完成什么?
  • @Bavarious,你是对的。这是一个奇怪的例子。如果你给我举一个更好的例子。我实际上并没有这样做。随意编辑它。
  • 我不确定,@Matt。如果将代码修改为使用类方法,则不需要-dealloc。如果代码被修改为使用实例变量,那么 ARC 会负责释放它。此外,static 并没有真正影响代码,因为它的功能是限制该变量与 ExampleClass.m 的可见性/链接——如果删除了 static,内存管理将是相同的。

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


【解决方案1】:

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

这意味着通过将dealloc 中的exampleString 设置为nil,您将保留nil(新值),它什么都不做,并释放旧值。

资源

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

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

【讨论】:

    猜你喜欢
    • 2013-11-14
    • 2011-07-30
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-07
    • 2011-11-11
    • 2014-03-06
    相关资源
    最近更新 更多