Изменение представления после addSubview, что является хорошей практикой?

#objective-c #ios #uiview

#objective-c #iOS #uiview

Вопрос:

Это может показаться вопросом новичка, однако я новичок в разработке iOS. Предположим, у вас есть этот код.

 UILabel* label = [[UILabel alloc] init];
...
[someScrollView addSubview:label];
...
label.text = @"Some Text";
  

является ли хорошей практикой изменять представление после addSubview?
На самом деле меня беспокоит следующее, вероятно, возможно, что метка будет выпущена до достижения label.text назначения, например, в viewDidUnload , верно? и назначение завершится ошибкой.

В целом, мои вопросы

  • рекомендуется ли изменять представления после addSubview?
  • является ли хорошей практикой выпускать view после addSubview, а позже, если мне нужно получить какое-либо подпредставление для его поиска, используя следующую технику for (UIView *view in self.subviews) { if (...) ... } ?

Ответ №1:

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

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

Ответ №2:

Ваш код в порядке, если он используется одним и тем же методом и label не переназначается ни в одном из … разделы.

Изменение представления до или после добавления его в subview не имеет значения.

Если вы выделили представление, затем добавили его в subview, и вы не хотите сохранять отдельную ссылку на него, вы должны освободить его — это стандартное управление памятью. Супер-представление сохранит свои подвиды.

Чтобы снова получить ссылку на ваш subview, у вас есть два варианта:

  • Установите тег в subview перед его добавлением, затем используйте viewWithTag: , чтобы получить его позже
  • Сохраняйте ссылку на subview в качестве переменной экземпляра (в этом случае вы бы не освобождали ее после ее создания, вы бы выпустили ее при освобождении).

Ответ №3:

  • Я использовал оба способа — изменение до и после, и в любом случае у меня не было никаких проблем. Супервизор сохраняет вложенное представление, поэтому, если вы не выпускаете супервизор или где-то не устанавливаете для вложенного представления значение NIL, вы в безопасности.

  • Да, вам нужно освободить представление, которое вы добавили после addSubview, но проще всего сделать это следующим образом:

UILabel* label = [[[UILabel alloc] init] autorelease];

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