2013-07-16 2 views
0

Я читаю книгу (link), в которой говорится следующее: «Вся эта автоматическая очистка и переработка памяти происходит просто путем установки items на нуль. Это сила ARC».. Это говорит о следующем коде:Управление памятью iOS/ARC

// create array 
    NSMutableArray *items = [[NSMutableArray alloc] init]; 

    // add random BNRItems to the array 
    for (int i = 0; i < 10; i++) { 
     BNRItem *p = [BNRItem randomItem]; 
     [items addObject:p]; 
    } 

    // print items in array 
    for (BNRItem *item in items) { 
     NSLog(@"%@", item); 
    } 



    items = nil; 

Это в основном кратко объясняет, как с помощью настройки items = nil все объекты выше разрушаться правильно. Мой вопрос:

  • говорят, я использую ARC, и я не набор items = nil - это значит у меня будет утечка памяти?

Я испытал на переопределение dealloc из BNRItem и печати некоторой информации, dealloc, кажется, называется правильно на всех BNRitems, даже если я не установлю items = nil.

+0

Возможно, ваш метод работает в некоторых случаях, но нам нужна ARC для автоматической очистки объектов, иначе может возникнуть много проблем с утечкой памяти. –

+0

Это не то, о чем спрашивает ОП. – dandan78

ответ

1

Установка ссылки на nil сообщает ARC, что вы закончили с ней и сразу же очистили ее. Не устанавливать его на nil не означает, что он не будет очищен, он просто не может быть очищен так быстро.

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

+1

Да, я вижу, я смущен этим предложением в книге: «Вся эта автоматическая очистка и переработка памяти происходит просто путем установки элементов в нуль. Это сила ARC». - в этом предложении указано, что установка элементов в нуль очистит все содержимое, но это не означает, что очистка не произойдет, если вы не установите items = nil. –

2

Нет, это не утечка. ARC будет выполнять сообщение о выпуске, когда оно выходит за рамки. Сроки/последовательность не являются конкретными для целей оптимизации. Технически, он имеет право использовать autorelease.

+0

Да, я вижу, я смущен этим предложением в книге: «Вся эта автоматическая очистка и переработка памяти происходит просто путем установки элементов в нуль. Это сила ARC». - в этом предложении указано, что установка элементов в нуль очистит все содержимое, но это не означает, что очистка не произойдет, если вы не установите items = nil. –

+0

@ user2568508 easy to misconstrue - ARC также выпустит ваши ivars в -dealloc. – justin

Смежные вопросы