Ответ
XIB (XML Interface Builder) компилируется в бинарный NIB-файл на этапе сборки проекта. Непосредственное чтение (десериализация) NIB и создание объектов интерфейса происходит во время выполнения (runtime) при явном вызове методов загрузки.
Типичные точки загрузки:
- Для UIViewController: При инициализации через
init(nibName:bundle:)или при создании контроллера из storyboard, если для него указан отдельный XIB. - Для UIView: При явном вызове
UINib(nibName:bundle:).instantiate(withOwner:options:)илиBundle.main.loadNibNamed(_:owner:options:).
Пример:
// Загрузка кастомного UIView из XIB
if let loadedViews = Bundle.main.loadNibNamed("CustomView", owner: nil, options: nil),
let customView = loadedViews.first as? CustomView {
addSubview(customView)
}
// Кэширование UINib для эффективной многократной загрузки
static let nib = UINib(nibName: "CustomCell", bundle: nil)
let cell = Self.nib.instantiate(withOwner: nil, options: nil).first as! CustomCell
Важные детали:
- Загрузка происходит синхронно в том потоке, где вызвана (обычно главный).
- После создания объектов из NIB автоматически устанавливаются связи IBOutlet и IBAction.
- Для оптимизации интерфейсов, создаваемых многократно (например, ячеек таблицы), рекомендуется кэшировать экземпляр
UINib.