Возможно, что в этих примерах используется сохранение, поскольку образец кода программно выделяет и инициализирует UILabel, а затем добавляет его в UIView. Это относится ко многим примерам, поскольку изучение того, как использовать Интерфейсный Разработчик, часто не является их целью.
Второй пример (без свойства и без синтеза) с IBOutlet используется, когда разработчик «назначает» UILabel (Button, View и т. Д.) В Интерфейсном Разработчике - перетаскивая IBOulet в Label или другой компонент View. , По моему мнению, предыдущее действие перетаскивания (Метка на представление) также добавляет подпредставление, Метку к представлению - и так далее. Метка сохраняется в представлении; Вид сохраняется в Window; Окно сохраняется владельцем файла. Владельцем файла обычно является ваш Документ, который загружается в main.
Вы заметите, что когда вы проходите через свою программу (добавив awakeFromNib
- (void)awakeFromNib
{
[fooLabel blahblah];
}
что fooLabel уже имеет адрес памяти.
Это потому, что метка была инициализирована из комплекта файлов (nib-файла) с использованием не init, а initWithCoder. По существу десериализует файловый поток в объект, а затем устанавливает переменную IBOutlet. (Мы все еще говорим о методе IBOutlet).
Также обратите внимание, что вышеупомянутый метод iOS использует метод Key Value
call [object setValue:outletValue forKey:@"<OutletName>"]
который является паттерном Observer / Observable. Этот шаблон требует, чтобы объект Observable ссылался на каждого наблюдателя в наборе / массиве. Изменение значения будет повторять Set / Array и одинаково обновлять все Наблюдатели. Этот Набор уже сохранит каждого Обозревателя, поэтому в iOS его нет.
Далее, а остальное - спекуляция.
Похоже, что когда вы используете Interface Builder, тогда
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
возможно следует изменить на
@property (nonatomic, weak) IBOutlet UILabel *fooLabel;
или
@property (nonatomic, assign) IBOutlet UILabel * fooLabel;
И тогда его не нужно освобождать в методе dealloc. Кроме того, он будет соответствовать требованиям OSX и iOS.
Это основано на логике, и я мог бы пропустить некоторые части здесь.
Тем не менее, это может не иметь значения, если представление сохраняется в течение всей жизни вашей программы. Принимая во внимание, что метка в модальном диалоговом окне (открыть, закрыть, открыть, закрыть) может фактически иметь избыточное удержание и утечку за цикл. И это потому, что (снова предположения) каждое закрытое диалоговое окно сериализуется в файловую систему и, таким образом, сохраняет x, y позицию и размер, а также свои подпредставления и т. Д. И впоследствии десериализуется ... на следующем открытом сеансе (в противоположность минимизировать или скрытый.)