2010-05-09 3 views
0

좋아, 여기 내 문제가 있습니다. 내 iPhone 앱은 디스크에 1.2MB입니다. 내가 GUI 버튼과 배경 등을위한 많은 이미지를 가지고 있음을 감안할 때, 메모리에 내 앱이 무려 15MB를 차지합니다!iPhone 앱이 너무 많은 메모리를 차지합니다.

즉, 카메라로 사진을 찍으면 (기본값 : 8MB) 피커가 대리인에게 전화하기 전에도 메모리 경고가 표시됩니다 (여러 개).

어떻게 많은 양의 메모리를 가져오고 제거하는 방법을 알 수 있습니까? 모든 디버깅 기호를 제거하고 [-Os]를 추가했지만 여전히 많은 양의 메모리가 필요합니다!

은 --- 편집 ---

내 앱가 strongfortressgames.weebly.com에 있습니다 - 응용 "Thunderclash는"15 MB의 차지! 그것은 바보 같은 작은 응용 프로그램입니다! 어떻게하면 더 작게 만들 수 있습니까?

+0

해결 질문을 별도의 질문으로 나눕니다. –

+0

테스터의 jailbroken 전화로 문제가 악화 된 것으로 보입니다. 디스크에 이미지를 저장하지만 메모리에로드하지는 않습니다. –

답변

2

메모리 경고가 나쁜 유일한 시간은 메모리를 확보 할 수없는 경우입니다. 그런 다음 메모리 오류가 발생하고 응용 프로그램이 종료됩니다.

png 및 jpg와 같은 압축 이미지를 메모리에로드하면 압축이 해제되고 크기가 10 배가됩니다. [UIImage imageNamed:]을 사용하면 메모리에 이미지가 캐시됩니다. 이것은 xib에 의해로드 된 이미지에 함축되어 있습니다. 메모리 경고를 받으면 캐시에서 이미지를 해제합니다.

이미지가 아닌보기는 렌더링 된 내용을 메모리에 캐시 할 수 있습니다. 메모리 경고가 수신되면 캐시가 현재 표시되지 않는 한 지워집니다. 전체 뷰 계층 구조는 현재 표시되지 않은보기 컨트롤러에 의해 해제 될 수도 있습니다.

메모리 경고는 응용 프로그램 런타임의 일반적인 부분입니다. 그들은 메모리 누출을 나타내지 않습니다. 그들은 단순히 유휴 메모리가 해제되어야한다고 시스템과 시스템에 알려줍니다.

메모리 경고없이 실행하는 것이 바람직한 목표 일 수 있지만 일반적으로 메모리를 할당해야하며 다른 것들이 필요하지 않으면 메모리를 유지하는 것이 더 효율적입니다. 이미지가 메모리 캐시에서 지워지면 다음에 디스크에서 이미지를 읽어야합니다.

한 번 또는 아주 드물게 필요한 이미지가있는 경우 캐싱을 피하기 위해 [UIImage imageNamed:] 외의 호출로 이미지를로드 할 수 있습니다. 예를 들어 애플리케이션으로로드되는 보조 스플래시 화면이 시작됩니다.

+0

내가로드하는 대부분의 이미지는 번들 또는 사용자가 사진을 찍거나 라이브러리에서로드 한 것에서 가져옵니다. 내가 가진 문제는 카메라로 사진을 찍는 것입니다. 대리인이 저장하기 전에 사진이 손실됩니다. 내가 디스크에 쓸 수 있기 전에 집을 청소하는 것 같습니다. –

+0

아, 나는 질문에서 그것을 놓쳤습니다. 한 번에 24MB를 초과하여 이미지를 열었거나 문제가 생길 정도로 이미지를 열었습니다. 필자는 더 많은 것을 제공 할 필요는 없지만, 자동 릴리즈가 아닌 경우에는 [UIImage dealloc]에서 중단 점을 설정하는 것이 도움이 될 것입니다.내 직감은 그것이 부분적으로 메모리 경고와 관련이 있으며 다른 것은 잘못된 것입니다. 행운을 빕니다. – drawnonward

0

귀하의 앱이 디스크/카트에 큰 것이 아니라면 앱에 내부적으로 매우 큰 메모리 할당이 있음을 의미합니다. memAlloc/new() 함수에 휴식 또는 로그 추적기를 추가하고 공간을 먹고있는 것을 확인하십시오. 압축이 풀린 대형 GUI 구성 요소는 매우 크고 버퍼링 된 사운드 파일과 같은 범인이 될 수 있습니다. 그래도 로그 추적이 없으면 추측 할 수 있습니다. 대신 소스로 이동하십시오.

관련 문제