Iphone 使用以前的值为NSString变量设置新值

Iphone 使用以前的值为NSString变量设置新值,iphone,objective-c,ios,automatic-ref-counting,Iphone,Objective C,Ios,Automatic Ref Counting,我正在用最新的SDK和XCode开发一个iOS应用程序 这是一个简单的问题,但我不知道怎么做,因为我不希望我的代码有任何内存泄漏 我在我的项目中使用了ARC,我有以下标题声明: @interface UserPreferences : NSObject { NSUserDefaults* prefs; } @property (nonatomic, readonly) NSString* appLanguage; // More code - (void) setAppLangua

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

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

我在我的项目中使用了ARC,我有以下标题声明:

@interface UserPreferences : NSObject
{
    NSUserDefaults* prefs;
}

@property (nonatomic, readonly) NSString* appLanguage;

// More code

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

// More code
@end
这就是我如何实现
-(void)setApplLanguage:(NSString*)ApplLanguage

- (void) setAppLanguage:(NSString *)newAppLanguage
{
    [prefs setObject:appLanguage forKey:APP_LANGUAGE_KEY];
    appLanguage = [NSString stringWithString:newAppLanguage];
}
Is
appllanguage=[NSString-stringWithString:newappllanguage]正确吗

我不知道当我为它设置一个新值时,
appllanguage
将有一个值


我的代码正确吗?

您的代码没有任何泄漏;ARC会自动为您释放
ApplLanguage
的上一个值。我会编写
appllanguage=[newappllanguage copy]
,而不是使用
stringWithString:
,但效果是一样的

除非您省略了一些代码,否则这将不起作用

您已经为
NSUserDefaults
创建了一个实例变量,但从未使用值对其进行过实例化。当您调用
[prefs setObject:appllanguage forKey:APP\u LANGUAGE\u KEY]
prefs
将为
nil.

在某些情况下,在使用
prefs
之前,需要执行如下操作:
prefs=[NSUserDefaults standardUserDefaults]

如果您在其他地方实例化了pref,那么这个逻辑仍然会有问题。您可能正在尝试将NSUserDefaults更改为传入的新语言。在这种情况下,方法应为:

- (void) setAppLanguage:(NSString *)newAppLanguage {
    _appLanguage = newAppLanguage; // implicit synchronize will set the ivar as _appLanguage
    [prefs setObject:newAppLanguage forKey:APP_LANGUAGE_KEY];
    [prefs synchronize];
}
由于默认情况下,
\u appLanguage
实例变量设置为
strong
,ARC将自动添加必要的
release
retain
代码,以防止内存泄漏


另外,如果您试图创建一个私有setter方法,请使用
-(void)setApplLanguage:(NSString*)applLanguage在界面外。如果您不想创建私有setter,请从属性声明中删除
readonly

如果ApplLanguage是NSString,而NewApplLanguage也是NSString,则不需要使用stringWithString:,只需将两者相等即可。ApplLanguage=NewApplLanguage<代码>应用语言将有一个值,当我为它设置一个新值时。
它将有一个值,新值将替换它以前的值。您只需编写
@property(strong)NSString*appllanguage
和SetApplLanguage以覆盖默认设置器。不需要将一个设置为只读,然后在我将其设置为写+读时造成混乱。我想问的是如何为appLanguage设置一个新值。为什么要复制一个不可变的NSString?@JShapiro问题是,
newAppLanguage
可能是一个NSMutableString(因为它是NSString的子类),因此,除非你先复制它,否则它可能会发生惊人的变异。(这就是为什么苹果通常将NSString、NSArray和类似的对象声明为复制属性。)啊。。。这是有道理的。谢谢