我有一本书中的以下代码。
有一个函数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];
}
感谢!!!!
答案 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
。