2013-04-02 6 views
0

У меня есть небольшой вопрос при программировании объектов в объективе-C. У меня есть приложение, которое просто завершено, и все работает нормально. Мой вопрос заключается в том, что я устанавливаю свои объекты в ноль и отпускаю их в соответствующее время.Когда я использую removeFromSuperview?

Но этого достаточно или когда и где следует использовать removefromsuperview?

В случае добавления UIButton к UITableViewCell добавляю UIButton со следующим кодом:

UIButton *buttonReset = [UIButton buttonWithType:UIButtonTypeContactAdd]; 
buttonReset.frame = CGRectMake(250.0f, 7.0f, 75.0f, 30.0f); 
[cell addSubview:buttonReset]; 
buttonReset addTarget:self action:@selector(resetSettings) forControlEvents:UIControlEventTouchUpInside]; 
buttonReset = nil; 
[buttonReset release]; 

Мне также нужно использовать

[buttonReset removeFromSuperview]; 

в этом случае делать?

+0

Нет, просто сделайте объект нолем и отпустите. Это будет хорошо. –

+1

@ Суреш. Это неправильно. См. Dasblinkenlight и мой ответ. – DrummerB

ответ

-2

вы должны использовать только

[buttonReset removeFromSuperview]; 

, а затем

buttonReset = nil; 

как яблоко говоря

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

в UIView Referance

+0

@ScottCleland. При нажатии на ячейку табличный вид не освобождается (и не отпускается). Новый контроллер представлений (вероятно) помещен в стек навигационного контроллера, но контроллер вида с табличным представлением все еще хранится в памяти. – DrummerB

+0

@ScottCleland Не делайте никаких ваших предложений. Просто удалите последние две строки кода в своем вопросе, и все будет в порядке. – DrummerB

2

Нет, вы не должны вызывать [buttonReset removeFromSuperview];, по крайней мере, не сразу: если вы это сделаете, кнопка исчезнет с экрана (учитывая имя метода, это не должно вызывать удивления). Кроме того, вам не нужно устанавливать вашу кнопку на nil.

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

+0

Итак, учитывая, что это находится в UITableCell, когда я нажимаю на ячейку, а UITableView is dealloc, каков будет правильный порядок операций, которые я буду использовать? 'resetButton = nil; [resetButton release]; '~ OR ~' [resetButton removeFromSuperview]; resetButton = nil; '~ OR ~' [resetButton removeFromSuperview]; resetButton = nil; '~ OR ~' [resetButton removeFromSuperview]; resetButton = nil; [resetButton release]; ' –

+0

@ScottCleland Поскольку ваш' UITableView' освобождается (вместе со всеми ячейками, которые он может содержать) '[resetButton release];' все, что вам действительно нужно. Поскольку переменная локальна, нет необходимости устанавливать ее в 'nil'. – dasblinkenlight

+0

Не нужно ли вообще 'removeFromSuperview'? –

5
buttonReset = nil; 
[buttonReset release]; 

Это не имеет смысла. Вы устанавливаете указатель на nil (нулевой указатель), а затем отправляете ему сообщение. В большинстве других языков это приведет к сбою. В Objective-C это разрешено, но ничего не произойдет. Перед установкой nil вы должны установить release. Но в этом случае вы не должны делать этого, потому что buttonReset - это автореализованный объект (вы не использовали alloc/init для его создания), поэтому вы его не владеете, и поэтому вы не должны его выпускать.

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

Если вы еще не знали об этом, возможно, вы захотите рассмотреть возможность использования Automatic Reference Counting (ARC) в будущем.

+2

«Выпуск» не просто лишний, скорее всего, это приведет к сбою позже, когда 'cell' будет освобожден (и будет выпущен его subviews). Этого не произойдет, если указатель установлен на 'nil' раньше, но, как вы уже указали, это не имеет смысла. – omz

+0

Вот что я имел в виду, я отредактировал для ясности, спасибо. – DrummerB

0

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

В вашей ситуации я бы просто установил объект на нуль и покончил с ним.

См. does removefromsuperview releases the objects of scrollview?.

В нем есть интересная информация.

, но стоит углубиться в это, потому что это очень важная концепция в ObjC. Вы никогда не должны вызывать -release на объекте, которого вы не получили явно или неявно (путем вызова одного из трех магических слов). Вы не вызываете -release, чтобы освободить объект . Вы вызываете его, чтобы освободить трюм, который вы положили на объект. Независимо от того, сохраняет ли scrollview свои подзаголовки, это не ваш бизнес (он сохраняет свои подзаголовки, но его все еще не ваш бизнес). -removeFromSuperview calls -release также не является вашим бизнесом. Это между scrollview и его subviews. Все, что имеет значение, заключается в том, что вы сохраняете объекты, когда вам это нужно, и отпустите их, когда вы остановите , заботясь о них, и пусть остальная часть системы позаботится о , сохраняя и отпуская то, о чем она заботится.

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