Objective-C中静态变量的内存管理

时间:2012-12-06 04:36:32

标签: objective-c memory-management static automatic-ref-counting

我想在Objective-C类中添加一个静态NSString,但是我对管理它的内存很谨慎。

NSString *myImportantString = 0;

@implementation MySingletonClass

/* Option 1 */
+ (void)initialize {
    myImportantString = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"criticalFolder"];
}


/* Option 2 */
+ (void)initialize {
    NSString *tmp = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPathComponent:@"criticalFolder"];
    myImportantString = [[NSString alloc] initWithString:tmp];
}

在选项1中,myImportantString是一个自动释放的对象,因此我如何知道它将在何时/何时发布?这种不确定性促使我改为使用选项2.但是,当我使用ARC时,它将如何/何时(如果有的话)将被释放?根据{{​​1}}方法,+initialize在方法中不再使用,因此ARC不会在myImportantString方法的末尾插入适当的release代码?

我(相对)有信心会为我正确处理,但我仍然想知道它是如何工作的。

2 个答案:

答案 0 :(得分:4)

选项1很好,因为全局变量myImportantString默认为strong。该字符串永远不会被释放(对全局来说是好的)。

答案 1 :(得分:2)

如果未指定所有权限定符,则LLVM编译器会将其视为__strong。这意味着你不必担心自动释放。此外,考虑到静态变量寿命与应用程序的生命周期一样长,您不必担心它何时被释放(可能永远不会,但我不能指向您的文档)。所以,两种选择都很好。