2010-03-20 3 views
0

나는 다음과 같은 코드를 가지고있다.변수를 공개해야합니까? iphone-sdk

이 함수는 loadPrefs이며, 함수의 끝 부분 전에 NSString * userTimeZone이 릴리스됩니다.

왜? 문자열은 alloc을 사용하여 생성되지 않았으며 stringForKey 함수가 자동 완성 된 NSString을 반환한다고 가정합니다. 이 오류 또는 뭔가 놓친 거니? 책에 오류가 있습니까? stringForKey에 대한 문서에서

(I 객관적-C에 새로운)가 언급 유일한 것입니다

특별 고려 사항

(가) 문자열이 경우에도 불변의 반환 값 원래 설정 한 문자는 문자열이었습니다.

코드 :

- (void) loadPrefs { 
    timeZoneName = DefaultTimeZonePref; 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey]; 
    if (userTimeZone != NULL) 
     timeZoneName = userTimeZone; 
    [userTimeZone release]; 
    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey]; 
} 

감사합니다 !!!!

+0

어떤 책입니까? 그냥 우리가 그것을 피할 수 ... –

+0

iPhone SDK 개발. 그러나이 코드 오류에도 불구하고 꽤 좋은 책입니다. – psebos

답변

0

네가 맞아. 이 코드에는 두 가지 문제가 있습니다. 문자열을 stringForKey:에서 부적절하게 해제하고 값을 인스턴스 변수에 할당 할 때 이 아닌을 유지합니다. userTimeZone입니다.

여기에 더 좋은 시도입니다 :

- (void) loadPrefs { 
    [timeZoneName release]; // In case there was a previous value 

    timeZoneName = DefaultTimeZonePref; // ASSUMPTION: DefaultTimeZonePref is a constant 
    // And thus doesn't need retain/release. 

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
    NSString *userTimeZone = [defaults stringForKey: TimeZonePrefKey]; 
    if (userTimeZone != NULL) { 
     timeZoneName = [userTimeZone retain]; 
    } 

    show24Hour = [defaults boolForKey:TwentyFourHourPrefKey]; 
} 

그리고 dealloctimeZoneName를 해제하는 것을 잊지 마세요.

+0

userTimeZone이 클래스 정의에서 선언 된 방법에 따라 달라지지 않습니까? –

+0

인스턴스 변수로 정의됩니다. 재산, 세터 또는 게터가 없습니다. 인터페이스 ** NSString * timeZoneName; ** – psebos

+0

Nathan : 속성 선언에 대해 "할당", "보유"및 "복사"옵션을 사용한다고 생각합니다. 이 경우에는 간단한 인스턴스 변수이므로 걱정할 필요가 없습니다. –

관련 문제