При загрузке nib-файла в системе iOS nib-объекты верхнего уровня, экземпляры которых при этом получаются, становятся автоматически освобождаемыми. Если не сохранить их так или иначе, то они вскоре исчезнут как дым. Предотвратить это можно двумя основными способами.

 

Сохранение объектов верхнего уровня

Если при загрузке nib-файла вызвать метод loadNibNamed: owner : options : или instantiateWithOwner: options : из класса UINib (см. главу 7), то в итоге возвратится массив типа NSArray, состоящий из объектов верхнего уровня, экземпляры которых получаются с помощью механизма загрузки nib-файлов. Следовательно, достаточно сохранить этот массив типа NSArray или же содержащиеся в нем объекты.

Например, когда экземпляр контроллера представления автоматически получается из раскадровки, он фактически загружается из nib-файла лишь с одним объектом верхнего уровня — контроллером представления. В конечном итоге из метода instantiateWithOwner: options: возвращается контроллер представления как единственный элемент массива. Этот контроллер представления затем сохраняется динамически в назначенном для него месте в иерархии контроллеров представления. Например, в приложении с основной раскадровкой функция UIApplicationMain {) служит для получения экземпляра первоначального контроллера представления из своего nib-файла и его присваивания свойству rootViewController объекта окна, который и сохраняет его.

Граф объекта

Если экземпляр объекта получается из nib-файла и является местом назначения для выхода, объект в источнике этого выхода может сохранить его (как правило, методом доступа). Таким образом, в цепочке выходов могут сохраняться многие объекты (рис. 12.2). Например, когда контроллер представления автоматически загружает свое основное представление из nib-файла, у его заместителя из nib-файла имеется выход представления к объекту верхнего уровня типа UlView в этом же nib-файле, а в методе setView: из класса UlViewController сохраняется его параметр.

 

 Граф объекта с сохранением

Рис. 12.2. Граф объекта с сохранением

 

Более того, основное представление сохраняет свои подчиненные представления, чтобы сохранились все они, их подчиненные представления и так далее по иерархии. (Именно поэтому экземпляр класса IBOutlet или свойство, создаваемое вами в ваших собственных контроллерах, как правило, обозначается как слабая ссылка weak. Несмотря на то что это необязательно, такая ссылка, как правило, не должна быть строгой strong, поскольку интерфейсный объект назначения в nib-файле уже подлежит сохранению благодаря своему месту в графе объекта.)

 

Предупреждение для программистов в системе OS X

Управление памятью, выделяемой для экземпляров объектов из загружаемых nib-файлов, осуществляется в системе OS X иначе, чем в системе iOS. Так, в системе OS X экземпляры объектов из загружаемых nib-файлов не являются автоматически освобождаемыми, и поэтому они не должны сохраняться. Управление памятью в любом случае осуществляется автоматически, поскольку владельцем файла обычно является контроллер типа NSWindowController, который берет на себя все эти обязанности. В системе iOS память, выделяемая для nib-объектов верхнего уровня, обязательно подлежит управлению.


 

 

 

Добавить комментарий