0

У меня есть NSMutableArray, содержащий целую кучу UITextFields, которые я создал и выделил память.Элементы настройки в NSMutableArray для nil

В моем методе viewDidUnload Мне нужно освободить эту память. Как мне это сделать?

for(int i = 0; i < [arr count]; i++){ 
    UITextField* txtField = [arr objectAtIndex i]; 
    txtField = nil; 
} 
arr = nil; 

Будет ли это работать? или мне просто нужно установить arr = nil ;?

Я использую ARC, поэтому я установил nil, а не release.

ответ

0

Давайте посмотрим, что делает ваш код, чтобы понять, что происходит:

UITextField* txtField = [arr objectAtIndex i]; 

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

txtField = nil; 

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

Массив никогда не изменяется. Вы повторили его содержимое, скопировали каждое значение, сохранили это значение, выпустили это значение. Наконец, вы пишете:

arr = nil; 

, который хранит ноль эталонное значение в arr. Поскольку arr содержит сильные ссылки, любой магазин заставляет ARC отказаться от доли владения (иначе «релиз») в предыдущем ссылочном значении, хранящемся в переменной, - и это предыдущее значение было вашей ссылкой на ваш NSMutableArray.Если нет других владельцев массива, он уничтожается, и когда массив уничтожается, он отказывается от своего владения любыми значениями, которые он содержит, что в данном случае является вашими UITextField экземплярами, а если нет другого владельца, то они разрушен ...

Так самое все, что вам нужно:

arr = nil 

но вы можете даже не нужно. Поскольку arr содержит сильные ссылки, когда его время жизни заканчивается - в конце блока или метода, содержащего его объявление, если локальная переменная или когда экземпляр уничтожается, если переменная экземпляра - тогда ARC откажется от своей доли владения и т. Д.

HTH

+0

Хорошо. В этом есть смысл. Спасибо за помощь. – user1087185

0

При использовании ARC вы отпускаете переменную, установив ее на нуль так же, как вы сделали с arr = nil. Обратите внимание, что память будет освобождена только тогда, когда все указатели на объект будут установлены на нуль, поэтому убедитесь, что вы не держитесь за них нигде.

Во-вторых, если вы работаете в памяти вопросы вы должны обработки это в методе didReceiveMemoryWarning как viewDidUnload больше не поддерживается прошивкой 6.

+0

Ok. Итак, из ios 6 я использую didReceiveMemoryWarning для выпуска чего-либо вместо viewDidUnload? – user1087185

+0

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

1

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

Если вам нужно вручную удалить массив, установите его в ноль.

arr = nil; 

Если вам необходимо повторно использовать массив позже, вам нужно будет перераспределить его после установки его на ноль.

Если предположить, что массив является @property вашего объекта, хороший фокус в том, чтобы выделить массив в поглотителе:

-(NSMutableArray*)arr { 
    if (!_arr) { 
     _arr = [[NSMutableArray alloc] init]; 
    } 
    return _arr; 
} 

Таким образом, вы всегда получите массив, когда вы пытаетесь получить доступ к нему, даже если он ранее был установлен на ноль.

+0

Обход является собственностью viewController. Так что мне не нужно = nil все, что я выделяю дугой? они просто автоматически освободятся после того, как контроллер покинет память, поэтому, когда я меняю контроллеры представления? – user1087185

+0

Правильно, это одно из больших преимуществ ARC. Раньше вам приходилось выпускать и удалять объекты. Теперь это сделано для вас. –

+0

Thats блестящий. Спасибо за помощь. – user1087185

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