2013-08-16 3 views
0

Я написал тестовый код, чтобы проверить, как использовать прибор (утечки). Я создал одно приложение просмотра и на кнопку мыши я загрузил новый вид, как это ...Обнаружение утечки C с помощью приборов (утечек)

- (IBAction)btn_clkd:(id)sender { 
    new_file *new = [[new_file alloc] init]; 

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

В new_file методе ViewDidLoad, я создать утечку, как показано ниже ...

- (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, и я не освобождал память после использования, хотя я снова и снова загружался и загружался, новый вид, инструмент (утечки) не обнаруживал утечки в этот код ... В чем причина, правильно ли я проверяю?

Thanx

ответ

1

С учетом вашего зрения контроллер освобожден (уточните, пожалуйста), В конечном итоге Утечки обнаружат, что c_mem Утечка указателя.

Инструменты могут не найти это немедленно - благодаря алгоритму, который он использует для обнаружения утечек.

Алгоритм в основном ищет unreferted переменные, похожие на указатели, указывающие на кучу. Если происходит, что есть произвольная переменная, скажем р, значение которого случается значение c_mem - то инструменты считает, что указатель c_mem еще ссылки из р - даже если р МАЕ содержат только произвольные данные и не ссылаются на c_mem.

Обратите внимание, что алгоритм обнаружения утечки инструментов на самом деле более сложный и может изменяться и улучшаться.

Чтобы найти утечки, я всегда запускаю специальные кодовые модульные тесты - в цикле. Если используемая память не растет вовремя, вы, как правило, хороши. Вы также можете использовать функцию «Снимок» для «Утечки» и функцию «Поколение Mark» для Allocations, чтобы проверить текущее состояние кучи.

0

Когда вы поп ваш ViewController, если ничего не имеет ссылки на него, он удаляется автоматически ARC со всеми его переменными. Вот почему вы не испытываете утечек.

Посмотрите, что происходит с вашим контроллером, когда вы его используете, используя Leak Instrument. Также вы можете увидеть там несколько ссылок. Также очень удобно обнаруживать циклы удержания.

Here - полная ссылка на использование инструментов.

+0

Но утечка здесь является способом C, использующим malloc ... будет ARC обрабатывать это также. – Newbee

+0

Область вашей переменной - это метод класса. Вот почему я думаю, что эти переменные уничтожаются после завершения метода. – wzbozon

+0

Вы правы, переменная будет уничтожена, однако я думаю, что это не динамически выделенная память. – Newbee