2009-11-03 4 views
1

NSXMLParser를 사용하여 구문 분석 알고리즘을 작성합니다. 최소 내 기억 사용량을 유지하기위한 최상의 전략은 무엇인지 의심스러워합니다.큰 XML 용 NSXMLParser iPhone 메모리 전략

XML을 구문 분석하는 동안이 객체의 노드가 가로 지르면 임시 Person 객체를 연속적으로 할당하고 해제하면서이 객체의 NSString 속성은 30 개입니다 (예 : "Person"). 이것을 검사했는데 언제든지 인스턴스화 된 Person 객체 중 하나만 존재합니다. 노드가 지나가고 사람이 "빌드"되면 사람을 NSMutableArray에 전달하고이 사람을 해제합니다. 거기에 아무런 문제가없는 것 같습니다. (내가 tableView에 대한 배열이 필요합니다). 배열에서 약 50 개 이상의 Person 객체에 접근하면 내 응용 프로그램이 종료되고 didReceiveMemoryWarning이 호출되지 않고 다른 경고도없고 parseErrorOccurred가 발생하지 않습니다.

xml의 사람 수를 제한하면 응용 프로그램이 정상적으로 작동하지만 Instruments에서 메모리 누수를 찾지 못했습니다. 배열에 50 개 이상의 Person 객체를 저장할 수 없다고 생각합니다. 약간 가혹한 것 같지만, 아이폰에 대한 많은 경험이 없습니다. 그래서 이것은 단지 추측입니다.

xml은 사용자가 아마 몇 개만 필요로하는 검색 결과입니다. 따라서 xml은 내 핵심 모델을 계속 유지하여 디스플레이를 유지하기 위해 약간 미친 것처럼 보입니다.

이 Person 오브젝트를 유지하는 좋은 전략은 무엇입니까? 또는 나는 아이폰이 이것보다 더 많은 것을 처리 할 수 ​​있어야하기 때문에 엄청난 메모리 누출을 놓치고 있는가?

희망 일부 숙련 된 개발자는 올바른 방향으로 날 지점 수 :

감사합니다!

+1

일부 샘플 코드는 내가 그 방법으로 몇 가지 통찰력을 찾고 있었다 도움이 – ACBurk

답변

1

이 문자열은 얼마나 걸립니까? 일반적으로 iPhone 3G 및 이전 모델에서는 앱에 최소 20MB의 메모리가 있어야합니다 (3G의 경우 훨씬 더 많음). 이것은 물론 절대적인 규칙은 아니지만 괜찮은 경험 법칙입니다. 50 개의 객체로이 많은 메모리를 차지하려면 Person 객체 당 ~ 400-500KB를 의미합니다. 이게 야구장에 있니? 그렇다면 모든 객체를 동시에 메모리에 보관하지 않는 메모리 관리 전략이 필요할 것입니다. 핵심 데이터는이 경우 많은 도움을 줄 수 있습니다.

+0

하이 올레 감사 할 것입니다 :) 내 Person 객체는 약 0.1KB이다. 임 (Im up)은 데이터가 작동하는 웹 서비스라고 생각하기 시작합니다. 나는 다른 양의 XML을 내 스크립트에 쏟아 부어 계속 테스트했는데 시뮬레이터에서 일관되게 충돌하지 않았다. 인스 트루먼 트를 사용하여 실행하면 충돌이 발생하지 않지만 약 250MB로 커집니다. 나는 Nathan이 무언가에 있다고 믿는다. Instrument는 누수를 발견 할 수 없으며 파싱이 끝난 순간 (URLConnection과 XMLParser가 해제 될 때) 할당 된 MB는 250에서 1.5로 할당된다. 고마워요 :) – RickiG

+0

저는 핵심 데이터 모델을 보유하고 있지만 실제로 50 가지 검색 결과를 표시하는 데 사용하는 것이 좋다고 생각합니다. 버그가 다른 곳에 묻혀 있다고 생각합니다. 어쩌면 천천히 내려서 인스트루먼트 도구를 살펴 봐야합니다. 감사합니다. – RickiG

0

메모리 경고를받지 못했다면 앱이 종료되지 않을 가능성이 높습니다. Xcode에서 전자 수첩으로 이동하여 장치를 선택한 다음 콘솔 탭을 클릭하십시오. 메모리상의 이유로 앱이 종료 된 경우 콘솔 로그에 메모리 부족으로 인해 앱이 종료되고 있음을 알리는 시스템 메시지가 표시됩니다.

+0

NSXMLParser를 이해하기 때문에'-parse'는 동기 메서드입니다. 즉, 구문 분석 프로세스가 끝날 때까지 실행 루프로 돌아 가지 않습니다. 그런 경우에는 메모리 경고를받지 못할 것입니다. –

+0

그것은 ... 개인적으로 나는 메인 쓰레드에서 XML 파싱을하지 않는다. (주로 UI가 잘리는 것을 피하기 위해) 메인 실행 루프는 이벤트를 잘 처리한다. –

4

색소폰 기반 파서되는 NSXMLParser에도 불구하고 않습니다 당신이 구문 분석하는 전체 XML 문자열이 메모리에 저장되는 것을 의미 입력 스트림을 구문 분석하지 지원. 이것은 자체적으로 큰 문제이지만, 구문 분석 할 때 Person 개체의 XML에서 문자열 데이터를 복제하기 시작할 때 문제가 악화됩니다.

문자열이 너무 크면 구문 분석 메모리가 한 번에개가 너무 많아서 두 번째 문제가 발생합니다.

NSXMLParser과 유사한 API를 제공하지만 디스크에서 데이터 스트리밍을 지원하는 Jim Dovey의 AQToolkit 라이브러리의 AQXMLParser을 사용하면 첫 번째 문제를 해결할 수 있습니다.

두 번째 문제는 Core Data, SQLite Persistent Objects와 같은 디스크 기반 지속성 기술을 사용하여 해결할 수 있습니다. 또는 사용자 개체를 디스크에 직접 저장하는 것만으로도 문제가 해결 될 수 있습니다.

+0

고맙다 Nathan 이것은 나에게 소리가 난다. :) 나는 SAX 파서가 메모리에서 스트림뿐만 아니라 덩어리를 읽을 것이라고 확신했다 :/나는 당신이 추천하는 ToolKit을 시도 할 것이고, NSXMLParser에 대한 오해 나를 위해! – RickiG

+0

나는 또한 실제로 AQToolkit 전체가 필요 없다고 언급 했어야합니다 ... iPhoneNonatomic.h, AWXMLParser.h, AWXMLParser.m, AWXMLParserDelegate.h 및 AWXMLParserDelegate.m을 프로젝트에 드롭하면됩니다. 그런 다음 NSXMLParser의 "initWithData :"API 대신 "initWithStream :"API를 사용할 수 있습니다. –

+0

그들은 ARC 소스 코드를 가지고 있습니까? –