1

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

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 时,它将如何/何时(如果有的话?)发布?根据+initialize方法,在方法myImportantString中没有再次使用,因此ARC不会release在方法末尾插入适当的代码+initialize吗?

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

4

2 回答 2

4

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

于 2012-12-06T04:48:52.480 回答
2

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

于 2012-12-06T04:48:41.903 回答