UINavigationItem жизненный цикл

Насколько я понимаю, в документации SDK жизненный цикл навигационного элемента UIViewController привязан к самому контроллеру, а не к его виду. Т.е. в реализации по умолчанию он создается по требованию и уничтожается с помощью контроллера представления - со всем содержимым, таким как элементы кнопок и titleView. Учитывая, что как элементы кнопок, так и titleView могут быть представлены экземплярами UIView - означает ли это, что после создания эти представления будут оставаться в памяти до тех пор, пока контроллер не будет уничтожен, и не пройдут через все предупреждения памяти?

Какой смысл в этом дизайнерском решении? Считается ли влияние на использование памяти слишком маленьким, чтобы беспокоить? Это действительно мало для приложения, которое везде использует настраиваемые кнопки / заголовки навигационной панели?

Легко явно связать некоторые свойства navigationItem с жизненным циклом представления контроллера - например, установить titleView в -viewDidLoad и поместить его в -viewDidUnload (self.navigationItem.titleView = nil). Но документация по свойству navigationItem предлагает избежать этого паттерна. Есть ли другие потенциальные проблемы, кроме приведенного примера с кнопкой возврата?

1 ответ

Добавлена ​​категория (snippet2) для отслеживания количества сохраняемых объектов и уничтожения элементов навигации, не стесняйтесь делать то же самое:) Похоже, что это не связано с предупреждением памяти. Объяснение будет исходить из здравого смысла, что контроллеры представления не должны использоваться с контроллером навигации: именно поэтому элемент nav добавляется с отдельной категорией (snippet1), а его жизненный цикл должен управляться с помощью nav-элемента. контроллер, а не сам экземпляр контроллера представления.

В случае, если пользовательские элементы nav настолько тяжелы, что вам нужно их выпускать всякий раз, когда это возможно, я оставляю реализацию по умолчанию, добавляю категорию пользовательских элементов nav и управляю этими элементами вручную, как мне хочется (опять же, требуется переопределение) UINavigationController такие методы, как nav-контроллеры didReceiveMemoryWarning, pushViewController:animated:, popViewControllerAnimated:animated:). Я не могу представить себе такой случай, когда это действительно необходимо.

фрагмент 1

@interface UIViewController (UINavigationControllerItem)

@property(nonatomic,readonly,retain) UINavigationItem *navigationItem; // Created on-demand so that a view controller may customize its navigation appearance.
@property(nonatomic) BOOL hidesBottomBarWhenPushed; // If YES, then when this view controller is pushed into a controller hierarchy with a bottom bar (like a tab bar), the bottom bar will slide out. Default is NO.
@property(nonatomic,readonly,retain) UINavigationController *navigationController; // If this view controller has been pushed onto a navigation controller, return it.

@end

фрагмент 2

@implementation UINavigationItem (Logs)


- (id)init
{
    NSLog(@"I'm initialized (%@)", [self description]);
    self = [super init];
    return self;
}

-(void) release
{
    NSLog(@"I'm released [%d](%@)", [self retainCount], [self description]);
    [super release];
}

-(void) dealloc
{
    NSLog(@"I'm deallocated [%d](%@)", [self retainCount], [self description]);
    [super dealloc];
}

@end
Другие вопросы по тегам