2012-12-10 2 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를 쓰면 기본 설정자를 무시할 수 있습니다. 하나의 읽기 전용을 만들고 나서 혼란을 만들어 내 글을 쓰거나 읽을 필요가 없습니다. –

답변

1

코드에 누수가 없습니다. ARC는 자동으로 이전 값인 appLanguage을 해제합니다. 내가 stringWithString:을 사용하는 것보다 appLanguage = [newAppLanguage copy]을 쓰겠지만 효과는 같습니다.

당신이 몇 가지 코드를 생략 한 않는
+0

왜 당신은 불변의 NSString 복사를 귀찮게하겠습니까? –

+0

@JShapiro 문제는''''newAppLanguage'''가 (NSString의 서브 클래스이기 때문에) NSMutableString이 될 수 있기 때문에 먼저 복사하지 않으면 놀라 울 정도로 변형 될 수 있다는 것입니다. (이 때문에 애플은 대개 NSString, NSArray 및 유사한 객체를 복사 속성으로 선언합니다.) –

+0

Ahh ... 그건 의미가 있습니다. 감사! –

0

이 작동하지 않습니다 ...

당신은 NSUserDefaults에 대한 인스턴스 변수를 만들었습니다,하지만 값으로 인스턴스를 생성 한 적이 없다. 당신이 다른 곳의 환경 설정을 인스턴스화 한 경우 prefs = [NSUserDefaults standardUserDefaults];

, 당신은 여전히에 문제가있을 것이다 : 당신은 [prefs setObject:appLanguage forKey:APP_LANGUAGE_KEY];prefs 당신이 prefs을 사용하기 전에, 당신이 뭔가를 할 필요가, 어떤 시점에서 nil.

될 것입니다 호출 할 때 논리. . 아마, 당신이 전달 된 새로운 언어에 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 코드를 사용하여 메모리 누수를 방지하십시오.

또한 개인 설정 메소드를 만들려는 경우 - (void) setAppLanguage:(NSString *)appLanguage;을 인터페이스 밖으로 가져옵니다. 전용 설정기를 만들지 않으려면 속성 선언에서 readonly을 제거하십시오.

+0

appLanguage에 새 값을 설정하는 방법에 대해 묻습니다. – VansFannel

관련 문제