2

비슷한 질문을 몇 번씩 물어 보았습니다.하지만 도움이되는 답변을 찾지 못했기 때문에 나와 함께하시기 바랍니다.NSMutableString이 append 또는 replaceOccurrencesOfString에 누출 된 경우

내 응용 프로그램이 누출되어 내 마음이 추락합니다. 사실, 누수를 사용하여 누출로보고되지 않지만 ObjectAlloc의 넷 바이트는 계속 올라가고 멈추지 않습니다. 길게 길면 (길지는 않지만) 결국 충돌로 이어집니다.

NSMutableStrings 문제가 발생합니다. 나는 그들에 대해 이해할 수없는 근본적인 것이 있거나, 추적하기가 어렵지만 NSMutableStrings 뒤에 숨어있는 다른 문제에 직면하고 있다고 생각합니다. 특히, NSMutableString을 대체하거나 대체 할 때마다 ObjectAlloc은 NSMutableString의 크기를 조정할 때 malloc/mallat의 불일치를 현장에서보고합니다. 이 문제에 직면 한 것은 이번이 두 번째라고 불편을 끼쳐 드려 죄송합니다. 처음 몇 시간 동안 혼란에 빠졌고 마침내 문제가 해결되었습니다 (마술!).하지만 그 이유는 모르겠습니다.

아래 코드를 보면 (몇 시간 쳐다 보았습니다) 문제가 보이지 않습니다. 나는 코드를보고 내가 책임이있는 유일한 객체 (aString)를 릴리스하고 NSMutableString이 크기를 조정 한 후에 정리를 처리해야하므로 괜찮을 것이라고 스스로 생각합니다. 두 번째 예제에서, 도움이되는 경우에 전달되는 문자열은 ASIHTTPRequest 객체 (responseString)에서 가져온 문자열이며 아무 것도하지 않습니다. 그것은 간단하게 ([DoStuff2 : [request responseString 요청]) 그렇게 불려지는 것입니다. 그리고 나는 스스로 요청을 해방하지 않습니다. (ASINetworkQueue를 사용하고 있고 요청이 나를 위해 파괴되었다고 가정합니다. 요청이 이미 다른 곳에서 릴리스 되었기 때문입니다.)

또한 아무것도하지 말아야한다는 것을 알고 있지만, 자동 풀 풀에 코드를 배치하려고 시도했습니다. 물론이 코드는 아무 것도 없습니다. NSOperation 내부에서 실행되고 있습니다. 아마도 NSOperations 자체에 대한 자동 릴리스 풀을 만들어야하기 때문에 문제가 발생한다고 생각했지만 아무런 노력을하지 않았습니다.

NSMutableString과 관련이 없지만 유사한 문제 NSString componentsSeparatedByStri 사용 방법. 때로는 분리 된 구성 요소를 가져 오는 배열에서 사용되는 메모리가 절대로 릴리스되지 않습니다. 흠 ... 일반적으로 문자열은 내게 다소 문제가있는 것처럼 보입니다.

누구든지 제공 할 수있는 도움을 주시면 감사하겠습니다. 더 많은 정보가 필요하면 추가하게되어 기쁩니다. 나는 해결책을 찾을 때까지 수 주일 동안 모든 문제 (그리고 다른 문제들)와 어려움을 겪었다 고 약속합니다. 이것은 유휴 요청이 아니라 도움을 얻기위한 진정한 외침입니다! 나는 많은 코드를 작성했으며 지금은 작은 누수 등을 봉인하려고 노력하고 있는데, 나는이 문제에 주목했다. 솔직히 말해서 Objective C의 메모리 관리가 나를 때려 눕힐 수있는 방법을 믿을 수 없습니다 ... 저는 Apple의 메모리 관리 문서를 여러 번 읽었습니다. 나는 그것을 철저히 이해하고 자신이 소유 한 객체를 공개하는 데 부지런히 노력했습니다. 때로는 내가 진정으로 이해하는지 궁금해한다. 나는 이것을 한 번 숙면하고이 모든 것을 완전히 이해할 수 있도록하고 싶다 - 수천 라인의 코드를 작성한 후에 이런 종류의 질문/문제를 갖기 위해서는 무서운/난처한/성가신.

다시 한 번 통찰력을 가진 사람이 있으면 감사하게 생각합니다. 시간과 노력에 감사드립니다. 내가 제안

-(void)DoStuff 
{ 
NSString *aString [ [[NSString alloc] initWithFormat:@"text %@ more text", self.strVariable]; 
[self.someMutableStringVar replaceOccurrencesOfString:@"replace" withString:aString options:NSCaseInsensitiveSearch range:NSMakeRange(0, [self.someMutableStringVar length])]; 
[aString release]; 
} 


-(void)DoStuff2:(NSString *)aString 
{ 
[self.someMutableStringVar appendString:aString]; 
} 
+0

'someMutableStringVar'는 @ 속성입니까? 그렇다면 어떻게 정의됩니까? 맞춤 설정기를 정의 했습니까? –

+0

안녕 Shaggy 개구리, 예, someMutableStringVar은 @synthesized 속성입니다 (기본 설정기를 사용합니다). – John

+0

나는 우리가보기에 완전한 모범을 보여 주는 것이 더 나을 것이라고 생각합니다. 나는 당신의 코드에서 여러 가지 이상한 것들을 보았다. (예를 들어, 당신은 자기 자신을 사용하여 왜 자신의 변수를 읽는가?) 그러나 전체를 보지 않고서는 특정 문제를 확인하기가 어렵다. 할당, 할당 취소, 속성 정의 및 (물론) 누수를 확인하고 싶습니다. :) –

답변

0

우선은 빌드 & 분석을하는 것입니다. 그것은 보통 내가 분명히 잘못한 것을 알아내는 데 도움이됩니다.

+0

안녕 Alexsander, 나는 그걸해야했다! 나는 xcode 3.1.4 (Leopard에서)를 사용 중이므로 빌드 및 분석 기능을 사용하지 않는다고 언급 했어야합니다. 그러나, 내가 그것을 기억하지 못했던 그의 이름 앞에 사용하고 사랑했던 도구 인 clang이 분석을 수행한다는 사실을 알게되었습니다. 그것을 지적 주셔서 감사합니다. – John

+0

분석과 Clang은 완전히 다른 별도의 코드 비트에서 몇 가지 문제점을 발견했습니다. 위와 관련된 문제는 없습니다. 다시 한번 감사드립니다. – John

1

게시 한 코드가 Cocoa 메모리 사용 지침에 올바르게 부합합니다. 보고 한 증상은 누출이 아니라 기억력 증대입니다. 이것이 성장이 일어나고있는 위치라는 것을 어떻게 확신합니까? 아마도 Instruments의 ObjectAlloc 도구는 많은 수의 여전히 살아있는 객체 할당을 위해 이러한 위치를 보여줍니다.

그렇다면 autorelease pool이 누락 된 것 같습니다. 표시된 코드에는 객체가 자동으로 리 릴리스되는 많은 작업이 있습니다. 이러한 작업이 발생할 때 활성 자동 릴리스 풀이 없으면 해당 메모리가 제대로 해제되지 않습니다. autorelease 풀이 설정되지 않은 백그라운드 스레드에서 이러한 작업을 수행하는 경우 발생할 수 있습니다.