Как UILabel / UIButton и т.д. Работает даже после освобождения их из памяти?

#iphone #uikit

#iPhone #uikit

Вопрос:

Например:

         UILabel *lblEmail = [[UILabel alloc] initWithFrame:CGRectMake(20, 10, 70, 30)];
[lblEmail setBackgroundColor:[UIColor clearColor]];
[lblEmail setText:@"Email"];
[lblEmail setTag:1];
[contentView addSubview:lblEmail];
[lblEmail release];
  

В приведенном выше коде мы создаем одну UILabel и освобождаем ее, и, следовательно, у нее больше нет ссылки на память, но все равно она работает, пока я запускаю приложение. и мы также можем изменить его значение, используя viewWithTag. Другим примером может быть то, что я создаю одну кнопку и отпускаю ее, но все равно, когда пользователь нажимает на кнопки, это работает.

Ответ №1:

В режиме просмотра содержимого сохранена метка / кнопка, поэтому она все еще доступна. Вы создаете его с числом сохранений, равным 1, добавление его в contentView дает ему количество сохранений, равное 2, а его освобождение дает ему количество сохранений, равное 1. Итак, он все еще существует.

Ответ №2:

Он не освобождается из памяти. Вы просто освобождаете свое сохранение этого. Когда вы добавляете его в качестве подвида contentView , оно сохраняется там внутри.

Комментарии:

1. Да, я в курсе этого… но давайте возьмем пример формы регистрации, где в моем представлении содержимого есть 10 меток и 10 текстовых полей … тогда количество сохраняемых в моем contentView равно 21… как я могу справиться с такой ситуацией?

2. вы управляете этим, следуя простому правилу… если вы несете ответственность за создание (выделение / инициализация, копирование и т.д.) Или сохранение объекта, вы несете ответственность за освобождение.

3. Количество сохранений в вашем contentView НЕ равно 21. Если вы добавите 10 меток и 10 текстовых полей, КОЛИЧЕСТВО сохранений КАЖДОЙ метки и текстового поля будет равно 1, а в самом contentView количество сохранений равно 1 (при условии, что ничто другое в приложении не удерживает эти объекты).

4. Правильно, и в качестве дополнительного примечания: НЕ беспокойтесь о количестве сохранений в любой данный момент, просто несите ответственность за свои действия, которые увеличили его, и выпускайте по мере необходимости. Слишком много людей смотрят на retainCount и пытаются разобраться в этом.

Ответ №3:

В документах Apple указано — (void)addSubview:(UIView *) view сохраняет view и устанавливает следующего ответчика представления для получателя, который является его новым супервизором.

Ответ №4:

lblEmail будет освобожден только после того, как количество ссылок на него равно 0. Они сохраняются в contentView.

Ответ №5:

Прочитайте документацию Apple для addSubview .

 - (void)addSubview:(UIView *)view
  

Добавляемый вид. Это представление сохраняется получателем

Документация Apple для UIView