2010-05-27 5 views
2

루프를 통해 텍스트를 구문 분석하는 루틴이 있습니다. 각 레코드가 끝날 때마다 문자열 변수를 지울 필요가 있지만 "someString = @" "실제로는 그냥 새 문자열 &을 가리키며 메모리 누수가 발생합니다.문자열 변수 코코아를 초기화/지우는 가장 좋은 방법

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 오히려 변경 가능한 문자열 변수를 사용해야하고 반복 사이에 setString : @ ""을 사용해야합니까?

+1

someString의 첫 번째 생성에 따라 다릅니다. 그 사람이 someString = [[NSString alloc] init]으로 정의한 다음 someString = @ ""을 수행하면 메모리 누수가 발생합니다. – vodkhang

답변

1

당신은 조심해야하는 경우에 당신이있는 NSString 만들 : (팩토리 메소드) 또는 (ALLOC 초기화 또는 (사용 @ "".) 당신이 @ 사용하는 경우

"", 그것은 일정한 문자열을, 여기 참조 : Constant NSString

당신이 사용하는 경우 [[있는 NSString ALLOC] 초기화], 당신은 it.You 그냥 [someString 해제]를 할 필요가 해제 할 필요가

당신이 [있는 NSString stringWithFormat 같은 것을 사용하는 경우 :. @ " "], 런타임에서 이미 자동으로 릴리스되었으므로 릴리스 할 필요가 없습니다.

+0

형식이 깨져서 잘 읽었습니다. ------------ ---------------------------------------- retain 속성으로 선언 된 객체는 어떻습니까? @property (비 원자력, 보유) NSString * someString; -------------------------------- 다음 복사를 통해 값을 할당했습니다. someString = [parsedCharacters copy]; ------------------ 및 상수 문자열 할당으로 지워진 someString = @ ""; 죄송합니다. 내 질문에 어리석은 것으로 보이지만 여기에 약간 잘못된 것이 있으면 retain 속성에 해당 릴리스가 있지만 릴리스에서 충돌이 발생하고 있습니다. 나는 무엇을 엉망으로 만들었습니까? –

+0

첫 번째 :이 속성은 self.someString을 사용하는 경우에만 사용됩니다. 그렇지 않으면 일반 할당으로 사용됩니다. 자, 자네를 사용하지 마라. 둘째 : someString을 @ ""과 같은 상수 문자열에 할당하면 해제하지 않아야합니다. 다시 링크를 살펴보십시오. self.someString = @ ""을 사용하는 경우에도 이것을 풀어서는 안됩니다. – vodkhang

+0

마침내 리터럴 문자열을 할당하고 팩토리 메서드를 사용하면 개체를 놓을 필요가 없습니다. retain 속성으로 선언 된 경우에도 맞습니까? –

0

NSString은 변경 불가능하므로 문자열의 내용을 변경할 수 없습니다. 그리고 이것을 ""초기화하면 상수 인 NSString 객체가 생성됩니다.

루프에 로컬 인 NSString으로 작업하고 루프의 끝에서 해제 할 수 있습니다. 대신 NSMutableString을 사용할 수 있습니다. 루프 로컬 문자열 선호합니다.

for (; ;) { 
    NSString* str = [[NSString alloc] initWithFormat:@"%@", CONTENT]; 
    ... 
    [str release]; 
}