2009-08-25 2 views
6

alt text는 메모리 누수 점검을위한 악기 이해 - 아이폰

주어진 이미지 위의 것은 내 응용 프로그램 누수이다.

여기 확장 정보에서 라이트 그린, 라이트 핑크, 라이트 브라운, 라이트 퍼플과 같은 다양한 색상을 볼 수 있습니다.

각 색상은 무엇을 나타 냅니까?

이제 다른 혼동은 "메모리 누수를 만드는 코드를 찾는 방법"입니다.

최대 메모리 누수의 한계까지 - 실제 아이폰과 함께 갈 수 있습니다. (가정 10 바이트 아무 문제, 20 바이트 아무 문제 & 200 바이트 문제) 무엇 각 색상을 나타냅니다 않습니다

  • ?
  • 우리 코드를 나타내는 색상/우리가 객체를 할당 한 코드를 어느 정도까지 얻을 수 있는지 & 잊어 버리셨습니까?

우리가 모든 누수를 해결해야하는 이유

  • (예를 들어 - - 세부에서 UIKit 두 번째 셀의 클릭에 우리는 코드에 도착하지 못할)? - 심지어 하나의 누수가 iPhone을 고칠 수 있습니까?
  • 왜 iPhone이 메모리에 누출을 허용합니까?/응용 프로그램이 종료 된 후 가비지 수집이 자동으로 수행되지 않는 이유는 무엇입니까?
  • 계측기에 따라 할당 해제되어야하는 개체의 할당을 해제하려고하면 내 응용 프로그램이 비정상적으로 종료됩니다. 내가 dealloc하지 않으면 내 응용 프로그램이 완벽하게 실행됩니다. 어떻게?
  • 보기에서 최대 10 초 이상 기다리는 것이 좋습니다. 누출이 있으면 악기에서 누출을 감지합니까?

답변

14

는 하나 [DashBoard를있는 viewDidLoad]에 어떻게가 지금의 URLConnection (가능하면 연결이 완료 될 때 것을 무료하지 않았다?)

를 초기화 년대에 누출 소스, 뭔가이며, 색상을 무시 다른 질문에 대답하십시오 :

  • 왜 우리는 모든 누출 문제를 해결해야합니까? - 하나의 누출조차도 iPhone을 iPhone에 꽂을 수 있습니까?

예. 그 이유 중 일부는 단순히 메모리가 부족해질뿐만 아니라 전체 휴대 전화에 대해 너무 많은 메모리가 필요하기 때문에 워치 독 응용 프로그램은 지속적으로 앱을 모니터링하고 메모리 사용이있는 경우이를 일찍 종료합니다 오직 성장하고 있습니다 ...

  • iPhone에서 메모리에 누출이 남아있게 허용하는 이유는 무엇입니까? ?/ 응용 프로그램이 종료 된 후 가비지 수집 이 자동으로 수행되지 않는 이유는 무엇입니까?

응용 프로그램이 종료되면 응용 프로그램 메모리가 모두 해제됩니다. 내가 이 악기에 따라 할당 해제해야 개체를 할당 해제하려고하면

  • 는 내 응용 프로그램 가 비정상적으로 종료됩니다. dealloc을 사용하지 않으면 내 응용 프로그램이 을 완벽하게 실행합니다. 어떻게?
  • 여기

내가 도울 수 없습니다, 당신은 정말 당신이 0의 유지 수를 가진 개체를 해제하는 경우, 응용 프로그램 충돌 객체가 사라 때문에 ...은/릴리스 메모리를 유지 사이클에 대한 자세한을 읽을 필요 . 당신이 10 초 이상까지 뷰에서 나올 때까지 기다리는 것이 좋습니다 왜

  • , 가 누출이있는 경우, 누수 은 계기에 의해 감지?

악기는 매번 메모리를 샘플링하여 작동하므로 악기가 조치를 취한 후 악기를 읽는 데 조금 시간이 걸릴 수 있습니다.

+2

+1 훌륭한 답변 Kendall. @sagar, 질문 3에 대해서는 dealloc을 직접 호출하지 말고 오직 유지하거나 해제해야합니다 (예외는 [super dealloc] 임). 나는 당신의 해결책이 autorelease를 구현하는 것이라고 믿는다. 왜냐하면 충돌을 조기에 객체를 해제함으로써 발생하는 것처럼 들리기 때문이다. 예 : [[[NSArray alloc] init] autorelease]; – h4xxr

3

색은 호출 스택이 진행하는 여러 라이브러리를 나타냅니다.

누출은 실제 할당이 OS 라이브러리 내에서 발생하는 경우에도 할당을 만든 코드의 프레임으로 인해 발생합니다. 악기 누설 된 메모리가 할당 된 정확히보여줍니다. 코드에서 누출 된 할당이 발생한 행을 파악해야합니다. 누락 된 할당은 오른쪽 스택의 프레임 중 하나입니다.

실제 iPhone에는 응용 프로그램에서 사용할 수있는 RAM이 많지 않습니다. 내 응용 프로그램이 작동하려면 약 25MB의 RAM을 보수적으로 계산하는 경향이 있습니다. 코드가 충분하게 사용된다면 아무리 작아도 누출은 속담을 가라 앉힐 수 있습니다.

5

우선 스택의 내용은 해당 라이브러리의 색상으로 표시되므로 많은 정보가 포함되지 않습니다.

둘째, iPhone이 얼마나 많은 누출을하는지 걱정하지 않고, 누출이없는 것에 집중할 것입니다.

  • 사용 CLANG static analyzer 프로젝트를 수동으로 누출
  • 봐 구축 : 누수를 찾으려면

    , 몇 가지 옵션이 있습니다. 당신은 항상은 메모리 관리의 규칙을 따라야합니다 : 당신이 alloc, retain, 또는 copy 객체 (@property (retain) 또는 (copy)를 사용 포함), 당신 해야release 또는 autorelease을.

1

스택 확장보기에서 응용 프로그램 이름을 찾습니다. 일반적으로 마지막에 메모리 할당이 표시되므로 어떤 라이브러리가 메모리 할당을 담당하는지 정확히 알 수 있습니다. 따라서 코드가 아래에서부터 끝까지 표시되는 줄을 따라야합니다. 색상을 사용하면 동일한 라이브러리와 관련된 코드 행을 쉽게 추적 할 수 있습니다. 동일한 라이브러리 호출은 같은 색상으로 채색됩니다.

누출 자체를 추적합니다. 먼저 확장 된보기에서 해당 줄을 두 번 클릭하여 응용 프로그램 호출로 이동하여 정확히 누출 된 내용을 이해하십시오. 때로는 새어 나오는 전화를 새어 나오지 않는 대체품으로 바꿀 수 있습니다. 예를 들어 imageNamed 호출을 사용하여 번들에서 이미지를 검색하면 메모리 부족으로 인해 응용 프로그램이 계속 충돌합니다. 난 그냥 구글 이미지를 봤 거든 누수와 내 응용 프로그램에서 이미지 현금을 구현하는 방법에 대한 매우 유용한 기사를 발견. 실제로 imageNamed API 누수가 발생합니다. 아이폰 SDK에서 누출되는 API가 있습니다.

또한 alloc/retain/release 등으로 작업하는 방법을 확인하십시오. 할당 된 메모리를 해제하거나 자동 해제하는지 여부를 확인하십시오.

형사 업무에 행운을 비 빕니다.

+0

@Nava Carmon - API 누수가있는 경우. 대답 해 주시겠습니까? 감사. –

0

나 또한 기기의 누출에 문제가 있습니다. 오늘 누수를 사용하여 처음으로 앱을 실행하고 몇 가지 누수가 발견되었습니다. 일부 마술 코드가 실행되고 내 물건의 보유 횟수를 높이 지 않는 한, 누수가 없어야하는 누출. 나는 메모리 관리 지침을 이해하고, 자동 풀 풀 (autorelease pools)을 사용하는 법을 안다. 그러나 빈 뷰를 기반으로하는 앱이라도 몇 가지 컨트롤을 넣으면 누수가 포함된다. 2-3 회 정도 클릭하십시오. 어서 시도해보십시오. 필자는 정보 수단이 제공하려고 시도하는 것을 정말로 이해하지 못합니다. 그 "누출"이 정말로 새는가요, 아니면 계측기 앱에 의심스러운 것입니까? 비어있는 앱에 사용자 코드가 없으면 몇 개의 컨트롤 만 빈 뷰 누출 메모리에 저장됩니까?

+0

나는 의심스런 "것들"이라고 나는 믿지 않는다. 누수 도구는 응용 프로그램의 쓰기 가능한 메모리, 레지스터 및 스택에 메모리 블록에 대한 참조가 있는지 확인합니다. 아무 것도없고 메모리 블록이 여전히 존재하면 계측기는 버퍼를 누출로 간주합니다. – hmak

+0

시뮬레이터 나 장치에 있습니까? 시뮬레이터에서 감지 된 '누출'이 실제 장치에서 실행될 때 나타나지 않으므로 시뮬레이터에서 프로파일 링 누출을 더 이상 신경 쓰지 않습니다. – daver

+0

장치에서 누설이 다르기 때문에 일반적으로 누출 수가 적습니다. 나는 아이폰 개발을 중단했다. –