2

我正在使用最新的 SDK 和 XCode 开发一个 iOS 应用程序。

这是一个简单的问题,但我不知道该怎么做,因为我不希望我的代码有任何内存泄漏。

我在我的项目中使用ARC,并且我有以下标头声明:

@interface UserPreferences : NSObject
{
    NSUserDefaults* prefs;
}

@property (nonatomic, readonly) NSString* appLanguage;

// More code

- (void) setAppLanguage:(NSString *)appLanguage;

// More code
@end

这就是我实施的方式- (void) setAppLanguage:(NSString *)appLanguage;

- (void) setAppLanguage:(NSString *)newAppLanguage
{
    [prefs setObject:appLanguage forKey:APP_LANGUAGE_KEY];
    appLanguage = [NSString stringWithString:newAppLanguage];
}

是否appLanguage = [NSString stringWithString:newAppLanguage];正确?

我不知道appLanguage当我为它设置一个新值时它会有价值。

我的代码正确吗?

4

2 回答 2

1

您的代码没有任何泄漏;ARC 会自动为您释放之前的值appLanguage。我会写appLanguage = [newAppLanguage copy]而不是使用stringWithString:,但效果是一样的。

于 2012-12-10T12:39:18.400 回答
0

除非你省略了一些代码,否则这是行不通的......

您已经为 创建了一个实例变量NSUserDefaults,但从未使用值对其进行实例化。当你打电话[prefs setObject:appLanguage forKey:APP_LANGUAGE_KEY]; prefsnil.

在某些时候,在使用之前prefs,您需要执行以下操作:prefs = [NSUserDefaults standardUserDefaults];

如果您在其他地方实例化了首选项,您仍然会遇到此逻辑的问题。据推测,您正在尝试将 NSUserDefaults 更改为传入的新语言。在这种情况下,该方法应该是:

- (void) setAppLanguage:(NSString *)newAppLanguage {
    _appLanguage = newAppLanguage; // implicit synchronize will set the ivar as _appLanguage
    [prefs setObject:newAppLanguage forKey:APP_LANGUAGE_KEY];
    [prefs synchronize];
}

由于_appLanguage实例变量strong默认设置为,ARC 会自动添加必要的release代码retain,防止内存泄漏。

此外,如果您尝试创建私有 setter 方法,请- (void) setAppLanguage:(NSString *)appLanguage;退出接口。如果您不想创建私有 setter,readonly请从属性声明中删除。

于 2012-12-10T12:49:22.813 回答