#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:
-
Можно изменить свойства представления после добавления его в качестве подвида. Эти свойства будут применены (или анимированы) на следующем этапе цикла выполнения, когда UIKit будет отображать материал.
-
Вы должны обязательно освободить свое представление после добавления его в качестве subview, если вам больше не нужно владеть им. Другими словами, следуйте рекомендациям по управлению памятью для всех программ cocoa. Выполнение addSubview приведет к тому, что текущий вид сохранит его (поскольку он в нем нуждается). Однако, если вам потребуется изменить свойство представления в будущем, вы должны сохранить его, чтобы иметь к нему доступ
Ответ №2:
Ваш код в порядке, если он используется одним и тем же методом и label
не переназначается ни в одном из … разделы.
Изменение представления до или после добавления его в subview не имеет значения.
Если вы выделили представление, затем добавили его в subview, и вы не хотите сохранять отдельную ссылку на него, вы должны освободить его — это стандартное управление памятью. Супер-представление сохранит свои подвиды.
Чтобы снова получить ссылку на ваш subview, у вас есть два варианта:
- Установите тег в subview перед его добавлением, затем используйте
viewWithTag:
, чтобы получить его позже - Сохраняйте ссылку на subview в качестве переменной экземпляра (в этом случае вы бы не освобождали ее после ее создания, вы бы выпустили ее при освобождении).
Ответ №3:
-
Я использовал оба способа — изменение до и после, и в любом случае у меня не было никаких проблем. Супервизор сохраняет вложенное представление, поэтому, если вы не выпускаете супервизор или где-то не устанавливаете для вложенного представления значение NIL, вы в безопасности.
-
Да, вам нужно освободить представление, которое вы добавили после addSubview, но проще всего сделать это следующим образом:
UILabel* label = [[[UILabel alloc] init] autorelease];
Тогда он будет выпущен автоматически, и вам не нужно беспокоиться о его явном освобождении.