2013-08-06 3 views
1

주된 스레드의 메모리에 실제로 큰 파일을 읽었습니다 (단순한 dataWithContentsOfFile: 메서드뿐만 아니라 일부 데이터 조작도하고있었습니다). 그리고 내 응용 프로그램이 손상되었습니다. 이 프로세스를 배경 스레드로 옮기면 앱이 더 이상 충돌하지 않습니다. 유일한 일은 내가 얻는 NSDatanil이라는 것입니다.큰 NSData를 가진 메모리 문제

메인 스레드에 영향을주지 않고 백그라운드 스레드 만 중단 될 수 있습니까, 아니면 뭔가 빠졌습니까? 또한이 동작에 의의를두고 응용 프로그램을 중단하지 않고 NSDatanil 일 때 오류 메시지 만 표시 할 수 있습니까? 미리 감사드립니다.

편집 :

내가 얻을 로그는 다음과 같습니다

의 malloc : *이 실패의 mmap (= 629,800,960은 크기) (오류 코드 = 12) 오류 : 지역 를 할당 할 수 없습니다 * * 디버깅 할 malloc_error_break에 중단 점 설정

사용중인 파일의 크기는 약 250MB입니다.

주 스레드에서 충돌하는 이유를 알고 있습니다. 내 질문은, 왜 보조 스레드에서 충돌하지 않았다는 것입니다?

+4

충돌 할 때 나타나는 오류 메시지는 무엇입니까? 파일이 얼마나 큽니까? 사용중인 코드는 무엇입니까? 이 정보가 없으면 누구나 말하는 것은 순수한 추측 일뿐입니다. – borrrden

+0

몇 가지 코드를 알려 주실 수 있습니까? – zahreelay

답변

0

나는 충돌에 의존 할 수 있다고 생각하지만, 메모리 부족 문제 (너무 많은 메모리를 사용하거나 너무 많은 객체를 생성 할 수 있음)가 발생하면 전체 응용 프로그램이 중단됩니다.

작은 파일로 앱을 테스트하고 동작 방식을 확인해야합니다.

+0

아니면 "모든 파일을 메모리로 읽어 들이기"위해 대체 기술을 사용합니까? – trojanfoe

+0

작은 파일에서도 작동하므로 메모리 문제 여야합니다. 나는 Instruments 와도 점검했고, 충돌은 iPad 2에 할당 된 약 300MB로 나타났습니다 (내가 메인 스레드에서 파일을 읽을 때). – Levi

+0

예, 트로이안 호프 말이 맞습니다. 이 경우 비트 단위로 파일을 읽는 것이 좋습니다. NSInputStream 확인 : https://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSInputStream_Class/Reference/Reference.html –