【问题标题】:should variable be released or not? iphone-sdk变量是否应该被释放? iphone-sdk
【发布时间】:2010-03-20 16:59:24
【问题描述】:

我有一本书的以下代码。

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

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

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

特别注意事项

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

代码:

- (void) loadPrefs {
    timeZoneName = DefaultTimeZonePref;

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

谢谢!!!!

【问题讨论】:

  • 那是哪本书?这样我们就可以避免它......
  • iPhone SDK 开发。然而,尽管有这个代码错误,它还是一本非常好的书。

标签: iphone cocoa-touch


【解决方案1】:

你是对的。这段代码有两个问题:它不正确地从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];
}

别忘了在dealloc 中释放timeZoneName

【讨论】:

  • 是否保留 userTimeZone 取决于它在类定义中的声明方式?
  • 它被定义为一个实例变量。没有属性,没有 setter 或 getter。就在界面NSString *timeZoneName;里面
  • Nathan:我认为您指的是属性声明的“分配”、“保留”和“复制”选项。在这种情况下,它是一个简单的实例变量,因此您不必担心。
猜你喜欢
  • 2011-05-26
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多