Присваивая контроллеры представления, которые помещаются в стек, сильной переменной / свойству экземпляра, они не будут освобождены, когда вытолкнуты из стека. Сильные свойства удерживают контроллеры push-представления даже после их выталкивания из стека, поэтому они никогда не попадают в состояние, в котором они могут быть освобождены.
Обычно, когда я помещаю контроллер представления следующего уровня в стек навигации, я делаю что-то вроде следующего:
SLSMoleculeSearchViewController *searchViewController = [[SLSMoleculeSearchViewController alloc] initWithStyle:UITableViewStylePlain];
[self.navigationController pushViewController:searchViewController animated:YES];
В ARC новый контроллер представления будет выделен и будет сохранен при создании. При перемещении в стек навигации он будет сохранен один раз контроллером навигации. Поскольку этот новый контроллер представления не упоминается после нажатия и не назначается сильному свойству или переменной экземпляра, ARC освободит его после второй строки.
Помните, навигационный контроллер все еще хранит его, поэтому он все еще хранится в памяти. Однако, как только навигационный контроллер вытолкнет его из стека, этот контроллер представления будет освобожден. Поскольку к этому моменту ничего не удерживается, оно будет освобождено, как и ожидалось.
Если по какой-то причине вам нужно сохранить ссылку на этот контроллер подчиненного представления в вашем контроллере представления более высокого уровня, вы можете использовать свойство weak
или __weak
переменную экземпляра. Это не будет держать на контроллере представления, и станет нулевым, как только контроллер будет освобожден.
weak
ссылки поддерживаются только для приложений, ориентированных на iOS 5.0, поэтому вы не сможете сделать это для всего, что должно работать на iOS 4.0. 4.0-совместимое свойство unsafe_unretained
- это не то, что я бы рекомендовал в этом случае из-за опасности указателя на освобожденную память.