2010-02-13 6 views
1

메모리 관리에있어 기본적인 차이가있는 것 같습니다. 아래 코드는 웹에서 다운로드 한 데이터를 구문 분석하기 위해 내 앱에서 여러 번 호출되는 싱글 톤 내에 있습니다. 내가 다운로드 한 각 기사에 대해 변경 가능한 문자열을 할당 한 다음 구문 분석 톤을 수행 한 다음 파일을 나중에 파일 시스템에 작성하여 나중에 UIWebView에 표시합니다.싱글 톤 속성을 사용하는 iPhone 메모리 관리

하지만이 메서드를 입력 할 때마다 새로운 "articleString"을 할당합니다. 그리고 나는이 문자열을 공개하지 않습니다. 이 누수가 생각하지만 파일을 쓴 후이 메서드의 아래쪽에 릴리스를 추가하면 내 응용 프로그램이이 메서드를 호출 한 다음에 충돌합니다. 다른 NSMutableString이 호출 될 때 다음 번에 할당되기 때문에 왜 충돌하는지 이해할 수 없습니다.

업데이트 : dealloc 메서드에서 articleString을 해제합니다. 그러나 내가 입력 할 때마다 할당하기 때문에이 방법의 끝에서 공개해야하는 것 같습니다.

@property (nonatomic, retain) NSMutableString *articleString; 

아래 parseArticle 방법 articleString 조작 방법의 시리즈를위한 자리이다

UPDATE : 헤더에 다음과 같이 정의된다 articleString.

self.articleString = [[NSMutableString alloc] initWithData:articleData encoding:NSUTF8StringEncoding]; 

//Parse the article for display 
[self parseArticle]; 

//Write the article string to a file for later display 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"article.html"]; 
NSLog(@"%@", articleString); 
[articleString writeToFile:path atomically:YES]; 
+1

'@property articleString'에 대한 정의는 무엇입니까? 'parseArticle'의 내용을 게시해야합니다.이 내용에는 약간의 유지/해제 오류가있을 수 있습니다. – Yuji

+0

위의 편집 된 질문보기. 고마워. –

답변

1

속성을 처리하도록합니다. articleString 속성을 retain으로 설정하면 간단합니다.

self.articleString = [[[NSMutableString alloc] initWithData:articleData encoding:NSUTF8StringEncoding] autorelease]; 

[self doStuff]; 

그런 다음

- (void)dealloc { 
    self.articleString = nil; 
    [super dealloc] 
} 

문서 문자열이 출시 얻을 것이다 당신은 새로운 하나를 설정할 때 적절하게 유지한다. 그리고 dealloc에서 정리 될 것입니다.

+0

왜 self.articleString = nil입니까; dealloc 메서드에서 [articleString release] 대신에? –

+0

으로 설정하면 유지 된 속성을 nil로 설정하면 해당 속성이 해제됩니다. 그리고 할당 된 방식 (명시 적으로 '보유'하지 않음)에 대한 직접적인 칭찬입니다. 그리고 이것은 충돌합니다 :'[articleString release]; [articleString someMethod]'nil에 메소드를 호출하는 것이 멋지 기 때문에 이것은 작동합니다 :'self.articleString = nil; [articleString doStuff]'. 그리고 똑같은 맥락에서, 이미 그것을 발표한다면,이 진술은 아무런 해를 끼치 지 않습니다. 일반적으로 같은 일을하는 반면 전반적으로 오류가 발생하기 쉽고 이해하기 쉽습니다. –

+0

확고한 규칙으로 dealloc 메서드를 제외하고는 속성을 해제하지 않습니다. 합성 된 속성 접근 자 메소드는 보유 수를 추적합니다. 속성을 직접 해제하려고하면 거의 항상 버그가 발생합니다. – TechZen