2009-05-28 9 views
3

Ok ......iPhone 메모리 관리 didReceiveMemoryWarning

저는 iPhone에서 간단한 OpenGL ES 응용 프로그램을 구현 중이며 최근에 Pinch Media Analytics에 추가했습니다. 이렇게하면 메모리 관리 문제가 밝혀 지는데 도움이되었습니다. 어떻게 처리해야할지 잘 모르겠습니다.

didFinishLoading에서 PNG 및 .CAF 파일을로드하는 응용 프로그램이 실행되고 리소스가 모두로드되며 정상적으로 실행됩니다.

내 프로그램이 충돌 (Pinch Media 라이브러리를 통합 할 때 발생)이 발생하거나 Safari를 실행하고 여러 페이지를 연 다음 내 게임을 시작하면 게임이 메뉴로 다시 충돌합니다. 그것은 기억이 안난다.

이 문제는 시스템을 하드 리셋 할 때까지 유지됩니다.

당신이 종류의 온라인 얻을 기본 응답은 아래와 같은 ....

- (void)didReceiveMemoryWarning 
{ 
    // default behavior is to release the view if it doesn't have a superview. 

    // remember to clean up anything outside of this view's scope, such as 
    // data cached in the class instance and other global data. 
    [super didReceiveMemoryWarning]; 
} 

을 didReceiveMemoryWarning 방법을 구현하는 것입니다 그러나 메모리에 들고 다른 프로그램의로이 정말 도움이되지 않습니다 내 꺼야. 나는 내 자신의 견해를 공개하고 싶지 않아? 이 상황을 처리하는 방법 및/또는 didReceiveMemoryWarning 이벤트가 발생하는 경우에 대한 설명이 있습니까?

답변

2

하나의보기 만있는 경우 사용하지 않는 데이터는 모두 해제하고 나중에 지연로드 할 수 있습니다.

하나 이상의보기가있는 경우 표시되지 않으면 해제 될 수 있습니다. 이 경우 해당 컨트롤러에 setView:nil이 전송됩니다. 이 문제는 모든 IBOutlet 변수를 즉시 해제하여 뷰가 xib에서 다시로드 될 때 올바르게 설정되도록 처리합니다.

이것은보기가 6보다 큰 정상적인 비 OpenGL ES 응용 프로그램에서 취하는 접근 방식이며 네비게이션보기에서 4 단계 깊이 일 때 일관되게 작동하며 모든 이전 컨트롤러의보기는 nil - 보기가 다시로드 될 때 지연이 있지만 뒤로 탐색 할 때 충돌이 없습니다.

아직 발견하지 못했다면 시뮬레이터에는 메모리 경고를 시뮬레이트하는 메뉴 항목이 있습니다. 실제 항목에서 조건이 발생하도록하는 것보다 쉽습니다. 즉, 실제 장치에서 동일한 시나리오를 테스트하지 않고 테스트를 쉽게 수행 할 수 있습니다.

+0

고마워. 이 방법은 하나의보기 만 있기 때문에 게으른로드 방법을 시도해 보겠습니다. – K2Digital

5

VM이없는 공유 메모리 풀에 오신 것을 환영합니다 .... 여기에 할 수있는 일이 많지는 않지만 몇 가지가 있습니다. (실제로 그것은 자신의 잘못이고 완전히 고칠 수 있습니다.) 게임 개발자는 이러한 이유로 사용자를 재부팅하기 전에 고객의 재부팅을 권장하는 경우가 많으므로 실제로 많은 메모리가 필요한 경우 동일한 보트에 있어야 할 수도 있습니다.

물론 자신의 메모리 사용 공간을 최소화해야합니다. 그러나 과도한 메모리 단편화를 피하려고 노력해야합니다. 때때로 문제는 기억이 없다는 것이 아닙니다. 충분히 큰 블록이 없습니다. 때로는 변경 가능 (Mutable)을 사용하고 새로운 불변 ​​객체를 생성하는 대신 변경을 유지하는 것이 더 나을 때가 있습니다. 특히 메모리를 낭비 할 수있는 큰 NSString의 경우에 특히 그렇습니다.

UIImage +imageNamed:은 이미지를 공개 한 후에도 계속 표시되므로 더 이상 필요하지 않으면 이미지를 지워야합니다. 캐싱을 중지하기 위해 이름을 해제하기 전에 이름을 nil로 설정하십시오.

인스 트루먼 트에서 앱을 실행해야합니다. 당신이 생각하는 것보다 더 많은 기억을 먹을 수도 있습니다.

autorelease 풀을 잊지 마세요. 단일 이벤트 루프에서 자동 회수 된 객체를 많이 생성하는 경우 주기적으로 풀을 소모시켜 메모리가 스파이크하지 않도록해야 할 수 있습니다. 메모리 급증으로 인해 메모리 요구 사항이 갑자기 줄어드는 프로그램이 생길 수 있습니다.

+0

감사합니다. Rob. 나는 그 기회를 줄 것이다. – K2Digital

+0

"계측기로 앱을 실행하십시오"는 가장 흥미로운 측정 방법은 "라이브 바이트?"입니다. –

+0

나는 일반적으로 "Created & Still Living"을 수명으로하는 Allocations 도구를 사용합니다 (기본값 임). 나는 또한 트랙 디스플레이 ("i") 스타일을 "할당 밀도"로 전환하는 것을 특히 좋아합니다. 기본적으로 사용 된 바이트 수의 1 차 미분을 제공하므로 많은 메모리를 갑자기 할당하는 장소를 쉽게 찾을 수 있습니다. –

0

PNG를 사용하는 대신 압축 PVRTC를 사용하여 가능한 성능 비용으로 공간을 절약 해보십시오.

가 여기에 좋은 작은 튜토리얼입니다 :

http://iphonedevelopment.blogspot.com/2008/12/preparations-for-porting-nehe-lesson-06.html

가 그리고 당신은 당신의 OpenGL의 몇 가지를 다시 작성해야합니다 명심이 다른 압축 된 텍스처를 처리하기 위해 호출합니다.

[면책 조항 : 저는 OpenGL ES 최적화 전문가가 아닙니다. looooong 촬영으로.]