变量是否应该被释放? iphone-SDK

时间:2010-03-20 16:59:25

标签: iphone cocoa-touch

我有一本书中的以下代码。

有一个函数loadPrefs,其中 NSString * userTimeZone 在函数结束之前被释放。

为什么呢?字符串不是用alloc创建的,我假设stringForKey函数返回一个自动释放的NSString。这是错误还是我错过了什么?这本书中的错误是什么? (我刚进入Objective-C)

在stringForKey的文档中,它唯一提到的是:

  

特别注意事项

     

退回   string是不可变的,即使是值   你最初设置的是一个可变的   字符串。

代码:

- (void) loadPrefs {
    timeZoneName = DefaultTimeZonePref;

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey];
    if (userTimeZone != NULL)
        timeZoneName = userTimeZone;
    [userTimeZone release];
    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey];
}

感谢!!!!

1 个答案:

答案 0 :(得分:0)

你是对的。这段代码有两个问题:它正在从stringForKey:不正确地释放字符串,并且当它将值赋给实例变量时 保留userTimeZone

这是一个更好的尝试:

- (void) loadPrefs {
    [timeZoneName release]; // In case there was a previous value

    timeZoneName = DefaultTimeZonePref; // ASSUMPTION: DefaultTimeZonePref is a constant
    // And thus doesn't need retain/release.

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey];
    if (userTimeZone != NULL) {
        timeZoneName = [userTimeZone retain];
    }

    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey];
}

不要忘记在timeZoneName中发布dealloc