2013-08-16 1 views
0

Instrument (Leaks) 사용 방법을 확인하는 테스트 코드를 작성했습니다. 나는 하나의 뷰 응용 프로그램을 생성하고 버튼을 ...Instruments (누수)를 사용하여 C 누출 감지

new_file의 viewDidLoad 방법에
- (IBAction)btn_clkd:(id)sender { 
    new_file *new = [[new_file alloc] init]; 

    if (new) { 
     [self.navigationController pushViewController:new animated:YES]; 
     new = nil; 
    } 
} 

, 나는 다음과 같은 누출을 만들 수 있습니다 ...이 같은 새보기를로드 한 클릭 한

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view from its nib. 

    char *c_mem = (char*) malloc(10000000); 
    strcpy(c_mem, "TESTING"); 
    // free(c_mem); 
} 

심지어 ARC를 사용하고 할당 된 메모리는 일반 C malloc이며 사용한 후 메모리를 해제하지 않았습니다. 새 뷰를 반복해서로드했지만 악기 (누수)가 누수를 감지하지 못하고 있습니다. 이 코드는 ... 이유는 무엇입니까, 나는 올바르게 검사하고 있습니까? 당신이 팝업

고맙습니다

답변

1

보기 컨트롤러가 할당 해제 되었다면 (확인하십시오) 결국 누출은 c_mem 포인터 누출을 감지합니다.

계기가 누출을 감지하는 데 사용하는 알고리즘으로 인해 즉시이 발견되지 않을 수 있습니다.

알고리즘은 기본적으로 참조되지 않은 변수가 힙을 가리키는 포인터처럼 보이는 것을 검색합니다. 는, 임의의 변수가 있다는 것을 발생하면 값이 페이지c_mem의 값으로 어떻게 말 - 다음 악기 생각 포인터 c_mem 여전히 페이지에서 참조되는 -이 경우에도 페이지를 임의의 데이터만을 포함하며 c_mem을 참조하지 않습니다.

계측기 누출 감지 알고리즘은 실제로 더 정교하며 변경되어 개선 될 수 있습니다.

누출을 찾기 위해 항상 루프 내에서 단위 테스트와 같은 특수 코드를 실행합니다. 사용 된 메모리가 시간에 맞춰 성장하지 않으면 일반적으로 좋습니다. 누수의 "스냅 샷"기능과 할당의 "생성 표시"기능을 사용하여 힙의 현재 상태를 확인할 수도 있습니다.

0

당신의 ViewController 아무것도가에 대한 참조가없는 경우, 그것은 모든 그것의 변수 ARC에 의해 자동으로 해제됩니다. 그래서 누수가 발생하지 않습니다.

컨트롤러를 누를 때 Leak Instrument를 사용하여 어떤 일이 일어나는지보십시오. 또한 거기에 많은 참고 자료가 있습니다. 유지 사이클도 감지하는 것이 매우 편리합니다.

Here은 Instruments 사용 방법에 대한 전체 참조 정보입니다.

+0

하지만 여기 누출은 malloc을 사용하는 C 방식입니다 ... ARC도 이것을 처리 할 것입니다 .. – Newbee

+0

변수의 범위는 클래스의 한 방법입니다. 그렇기 때문에 메소드가 끝나면 변수가 파괴 된 것 같습니다. – wzbozon

+0

당신은 옳은 변수이지만, 나는 동적으로 할당 된 메모리가 아닌 것 같습니다. – Newbee

관련 문제