2012-12-10 44 views
2

我正在開發與最新的SDK和XCode的iOS應用程序。設置一個新的值到一個NSString變量與以前的值

這是一個簡單的問題,但我不知道該怎麼做,因爲我不想在我的代碼上發生任何內存泄漏。

我使用我的項目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

如果appLanguage是NSString,newAppLanguage也是NSString,你不需要做stringWithString :,你可以等同於two.appLanguage = newAppLanguage; – Divya

+0

當我爲它設置一個新的應用程序時,'appLanguage將會有一個值。'是的,它會有,並且新的值將替換它以前的值。你可以簡單地寫'@property(strong)NSString * appLanguage;'和你的setAppLanguage來覆蓋默認的setter。沒有必要使一個只讀,然後造成混亂,我寫它+讀。 –

回答

1

您的代碼沒有任何泄漏; ARC會自動爲您發佈appLanguage的前一個值。我會寫appLanguage = [newAppLanguage copy]而不是使用stringWithString:,但效果是一樣的。

+0

你爲什麼要複製一個不可變的NSString? –

+0

@JShapiro問題是'''newAppLanguage'''可能是一個NSMutableString(因爲它是NSString的一個子類),所以它可能會出人意料地發生變異,除非您先複製它。 (這就是爲什麼Apple通常會將NSString,NSArray和類似對象聲明爲複製屬性。) –

+0

啊......這很有道理。謝謝! –

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將自動添加必要的releaseretain代碼,防止內存泄漏。

此外,如果您嘗試創建專用setter方法,請將- (void) setAppLanguage:(NSString *)appLanguage;帶出接口。如果您不想製作私人二傳手,請從屬性聲明中刪除readonly

+0

我在問如何爲appLanguage設置一個新的值。 – VansFannel

相關問題