将新值设置为具有先前值的NSString变量

时间:2012-12-10 12:28:13

标签: iphone objective-c ios automatic-ref-counting

我正在使用最新的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在设置新值时会有值。

我的代码是否正确?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

除非你省略了一些代码,否则这将无效......

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

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

如果你已经在其他地方实例化了prefs,那么你仍然会遇到这个逻辑的问题。据推测,您正在尝试将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会自动添加必要的releaseretain代码,以防止内存泄漏。

此外,如果您尝试创建私有的setter方法,请从界面中取出- (void) setAppLanguage:(NSString *)appLanguage;。如果您没有尝试创建私有设置器,请从属性声明中删除readonly