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インスタンス変数はデフォルトで に設定されているため、ARC は必要なコードstrongを自動的に追加し、メモリ リークを防ぎます。releaseretain

また、プライベート セッター メソッドを作成しようとしている場合は- (void) setAppLanguage:(NSString *)appLanguage;、インターフェイスから取り出します。プライベート セッターを作成しようとしていない場合はreadonly、プロパティ宣言から削除します。

于 2012-12-10T12:49:22.813 に答える