2011-03-04 4 views
0

나는 (아주) 커다란 csv 파일을 잡기위한 핵심 데이터로 가져 오는 앱을 만들고 있습니다. 이 과정은 이런 식입니다 :많은 NSString을 사용하여 메모리 사용량을 줄이거 나 NSString을 어떻게 릴리스합니까?

  1. 가이 조작을 포함한다 (코어 데이터로 배열을 가져 줄의 X 번호 후 NSStrings
  2. 의 NSMutableArray를 전체로 파일을 줄 단위로 구문 분석하고 어떤 경우에는 새 NSString 만들기)
  3. [NSMutableArray removeAllObjects];
  4. 린스와 메모리가 각 사이클이 끝날 때까지 해제해야 것 같습니다 언뜻

를 반복합니다. 그러나 대용량 파일의 경우, 몇 가지 메모리 부족 경고가 표시되면 앱이 다운되는 것을 발견했습니다. 누출 도구를 실행하면 대부분의 메모리가 CFString 객체에 의해 사용 중이라는 것을 알 수 있습니다. 비록 NSString 객체와 관련이 있다고 생각합니다. (비록 모릅니다.)

가능하면 NSString이 재사용된다는 것을 알고 있습니다. 비록 그들이 세부 사항을 전혀 이해하지 못한다고해도, 그들은 기억이 관련되는 다른 대상들과 아주 똑같이 행동하지 않는다. NSString 객체가 사용하는 메모리를 어떻게 회수 할 수 있습니까?

+0

의견을 보내 주셔서 감사합니다. 모두 똑같은 금액입니다. 내 autoreleased 개체에 대한 풀을 설립 및/또는 적절한 경우 초기화 메서드를 사용하지만 응용 프로그램은 여전히 ​​루프에 여러 반복 충돌이 발생합니다. 이것은 나에게 이해가되지 않는다 : 각 루프 사이에 메모리 풀을 뽑아 내고 있기 때문에 메모리는 반복 사이에 해제되어야한다. 맞습니까? 참고로 누수 도구를 사용하여 프로그램에 메모리 누수가 없다는 것을 확인했으며, 모양을 유지하기 위해 코드 분석을 자주 수행합니다. 제안을 주셔서 감사합니다. – JoBu1324

+0

나는 이제 더 자세한 정보를 얻었습니다. 적어도 메모리 중 일부는 해제됩니다. 코어 데이터 (-insertNewObjectForEntityForName : inManagedObjectContext)에 데이터를 삽입하는 코드를 실행할 때 메모리가 누적되는 것 같습니다. 나는 정기적으로 a-save 작업을 정기적으로 수행하므로 코어 데이터가 메모리 부족 상황을 처리 할 것이라고 생각했지만 코어 데이터가 메모리를 해제하지 않아도 문제를 일으킬 수 있습니까? – JoBu1324

+0

이 조사에는 여러 가지 청어가있었습니다 만, 자동 누출 풀이 작동하지 않는 이유는 누수가 지속적으로 감지되지 않는 메모리 누수가 있었기 때문이었습니다. 전혀 감지되지 않았습니다 빌드 및 분석. – JoBu1324

답변

2

는 (어떻게 모르겠지만) 대부분의 메모리가 내가있는 NSString 객체에 관련된 이해 개체를 CFString에 의해 사용되고 있음을 알려줍니다

NSString은 실제로 클래스 클러스터입니다. NSString을 사용하여 작업한다고 생각할지라도, 거의 확실하게 서브 클래스 중 하나를 사용하고 있습니다. Cocoa 프레임 워크는 상황에 따라 사용할 서브 클래스를 선택합니다.

CFString 실제로는 실제로 NSString이 아니며 Core Foundation에서 사용하는 순수한 C 문자열 개체입니다. 그러나 NSString에 대해 "유료 브리지"라는 것을 알게 될 것입니다. 즉, 코코아에서는 NSString처럼 보입니다. CFString을 많이 사용하는 이유는 이러한 문자열을 얻기 위해 사용하는 코코아 API가 궁극적으로 Core Foundation에서 작동하기 때문입니다.

어쨌든, 사실을 제외하면 모든 것은 그 문제와 관련이 없습니다. CFStrings가 많든 적든간에 NSStrings가 많이 있다는 것을 의미합니다. Girish가 이미 말했듯이, 메모리 공간을 줄이기 위해 필요한 것은 중첩 된 자동 풀 풀입니다. 첫 번째 단계로 알고리즘을 다음과 같이 수정하십시오.

  1. 새 자동 풀 풀을 생성하십시오.
  2. [NSMutableArray를 (이 조작하고 어떤 경우에는 새로운 NSStrings을 만드는 것을 포함), 선 X 번호 후 NSStrings
  3. 의 NSMutableArray를 전체로 파일 라인별로 파싱 코어 데이터로 배열을 가져 removeAllObjects];
  4. 는 오토 릴리즈 풀과 구문 분석 다만 브라켓을 고려,이 문제가 해결되지 않으면 오토 릴리즈 풀을
  5. 린스와 반복 (0에서 시작)

배수, 또는 단지 조금 도움이됩니다.

+0

CFString에 대한 정보를 제공해 주셔서 감사합니다! – JoBu1324

0

메모리가 NSString에서만 사용되는지 확신 할 수 없습니다. 나는 그것을 철저히 검사 할 것을 제안한다. "Build and Analyze"를 시도하면 누출을 찾는 데 도움이됩니다.

자신의 개체를 작성하고 당신이 그것으로 완료로 즉시 해제는 NSString 객체를 사용하는 대신

[NSString [email protected]""]; 

처럼 오토 릴리즈 객체가는 동안.

NSString * string = [[NSString alloc]initWithFormat:@""]; 
//use string object 
[string release]; 

이렇게하면 문자열 자체를 해제 할 수 있습니다.

또한 난 당신이 메모리 누수가없는 것을 가정하고 these memory management tips

2

를 보라 오토 릴리즈 풀

NSAutoReleasePool * pool = [[NSAutoReleasePool alloc]init]; 
// do you coding, creation of objects, releasing them, whatever... 
[pool drain]; or [pool release]; 

을 만들거나. 당신은 너무 많은 오토 릴리즈 객체를 사용하는 경우

이 당신은 --- 약간의 시간이 일부 긴 실행 루프를 가지고 일어날 경우 자동 해제

  1. 중첩 자동 해제 풀을 만들기 다음 시도

    일어날 수 있습니다 개체가 누적됩니다. - 그래서 필요할 때 자동 릴리즈 오브젝트를 해제하기 위해 커스텀 자동 릴리즈 풀을 추가하십시오.

  2. 구문 분석주기에 자동 회수 객체를 사용하지 마십시오. 작업이 완료되면 수동 객체 할당 및 해제를 수행하십시오.누수 도구를 실행