我想在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
代码?
我(相对)有信心会为我正确处理,但我仍然想知道它是如何工作的。
答案 0 :(得分:4)
选项1很好,因为全局变量myImportantString
默认为strong
。该字符串永远不会被释放(对全局来说是好的)。
答案 1 :(得分:2)
如果未指定所有权限定符,则LLVM编译器会将其视为__strong。这意味着你不必担心自动释放。此外,考虑到静态变量寿命与应用程序的生命周期一样长,您不必担心它何时被释放(可能永远不会,但我不能指向您的文档)。所以,两种选择都很好。